lib/asset.ex

defmodule Cardanoex.Asset do
  alias Cardanoex.Backend
  alias Cardanoex.Util

  @moduledoc """
  The asset module let's you work with native assets for a wallet.
  """

  @type asset :: %{
          policy_id: String.t(),
          asset_name: String.t(),
          fingerprint: String.t(),
          metadata: metadata(),
          metadata_error: String.t()
        }

  @type metadata :: %{
          name: String.t(),
          description: String.t(),
          ticker: String.t(),
          decimals: non_neg_integer(),
          url: String.t(),
          logo: String.t()
        }

  @spec list(String.t()) :: {:error, String.t()} | {:ok, list(asset())}
  @doc """
  List all native assets for a wallet.

  ## Options
    * `wallet_id` - hex based string. 40 characters
  """
  def list(wallet_id) do
    case Backend.list_assets(wallet_id) do
      {:ok, assets} -> {:ok, Enum.map(assets, fn a -> Util.keys_to_atom(a) end)}
      {:error, message} -> {:error, message}
    end
  end

  @spec get(String.t(), String.t()) :: {:error, String.t()} | {:ok, asset()}
  @doc """
  Get information about a specific asset.

  ## Options
    * `wallet_id` - hex based string. 40 characters
    * `policy_id` - hex based string. 56 characters
  """
  def get(wallet_id, policy_id) do
    case Backend.get_asset(wallet_id, policy_id) do
      {:ok, asset} -> {:ok, Util.keys_to_atom(asset)}
      {:error, message} -> {:error, message}
    end
  end
end