lib/myspace_ipfs/key.ex

defmodule MyspaceIPFS.Key do
  @moduledoc """
  MyspaceIPFS.Key is where the key commands of the IPFS API reside.
  """
  import MyspaceIPFS.Api
  import MyspaceIPFS.Utils

  @typep okresult :: MyspaceIPFS.okresult()
  @typep opts :: MyspaceIPFS.opts()
  @typep name :: MyspaceIPFS.name()
  @typep fspath :: MyspaceIPFS.fspath()

  @doc """
  Export a keypair.

  ## Parameters
    `key` - Name of the key to export.
    `output` - Output file path.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-export
  ```
  [
    output: <string>, # Output file path.
    format: <string>, # Key format.
  ]
  ```
  """
  @spec export(name, fspath, opts) :: okresult
  def export(key, output, opts \\ []) do
    post_query("/key/export?arg=" <> key, query: opts)
    |> handle_file_response(output)
  end

  @doc """
  Create a new keypair.

  ## Parameters
    `key` - Name of the key to generate.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-gen
  ```
  [
    type: <string>, # Key type.
    size: <int>, # Key size.
    ipns-base: <string>, # IPNS key base.
  ]
  ```
  """
  @spec gen(name, opts) :: okresult
  def gen(key, opts \\ []) do
    post_query("/key/gen?arg=" <> key, query: opts)
    |> handle_json_response()
  end

  @doc """
  Import a key and prints imported key id.

  ## Parameters
    `key` - Name of the key to import.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-import
  ```
  [
    ipns-base: <string>, # IPNS key base.
    format: <string>, # Key format.
    allow-any-key-type: <bool>, # Allow any key type.
  ]
  ```
  """
  @spec import(name, fspath, opts) :: okresult
  def import(key, file, opts \\ []) do
    post_file("/key/import?arg=" <> key, file, query: opts)
    |> handle_json_response()
  end

  @doc """
  List all local keypairs.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-list
  ```
  [
    l: <bool>, # Show extra information.
    ipns-base: <string>, # IPNS key base.
  ]
  ```
  """
  @spec list(opts) :: okresult
  def list(opts \\ []) do
    post_query("/key/list", query: opts)
    |> handle_json_response()
  end

  @doc """
  Rename a keypair.

  ## Parameters
    `old` - Name of the key to rename.
    `new` - New name of the key.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-rename
  ```
  [
    ipns-base: <string>, # IPNS key base.
    force: <bool>, # Allow to overwrite existing key.
  ]
  ```
  """
  @spec rename(name, name, opts) :: okresult
  def rename(old, new, opts \\ []) do
    post_query("/key/rename?arg=" <> old <> "&arg=" <> new, query: opts)
    |> handle_json_response()
  end

  @doc """
  Remove a keypair.

  ## Parameters
    `key` - Name of the key to remove.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-rm
  ```
  [
    ipns-base: <string>, # IPNS key base.
    l: <bool>, # Show extra information.
  ]
  ```
  """
  @spec rm(name, opts) :: okresult
  def rm(key, opts \\ []) do
    post_query("/key/rm?arg=" <> key, query: opts)
    |> handle_json_response()
  end

  @doc """
  Rotate a keypair.

  ## Parameters
    `oldkey` - Keystore name for backing up the old key.

  ## Options
  https://docs.ipfs.io/reference/http/api/#api-v0-key-rotate
  ```
  [
    type: <string>, # Key type.
    size: <int>, # Key size.
  ]
  ```
  """
  @spec rotate(name, opts) :: okresult
  def rotate(oldkey, opts \\ []) do
    post_query("/key/rotate?arg=" <> oldkey, query: opts)
    |> handle_plain_response()
  end
end