lib/ptax/moeda.ex

defmodule PTAX.Moeda do
  @moduledoc "Define a estrutura de uma moeda"

  use TypedStruct

  typedstruct enforce: true do
    field :nome, binary()
    field :simbolo, PTAX.moeda()
  end

  @doc """
  Retorna uma lista de moedas suportadas

  ## Exemplo

      iex> PTAX.Moeda.list()
      {:ok, [%PTAX.Moeda{nome: "Euro", simbolo: :EUR}, %PTAX.Moeda{nome: "Libra Esterlina", simbolo: :GBP}]}
  """
  @spec list :: {:ok, list(t)} | {:error, PTAX.Error.t()}
  def list do
    with {:ok, value} <- PTAX.Requests.moedas() do
      result = Enum.map(value, &parse/1)

      {:ok, result}
    end
  end

  defp parse(%{"nome_formatado" => nome, "simbolo" => simbolo}) do
    params = %{nome: nome, simbolo: String.to_atom(simbolo)}

    struct!(__MODULE__, params)
  end
end