lib/plaid/categories.ex

defmodule Plaid.Categories do
  @moduledoc """
  [Plaid Categories API](https://plaid.com/docs/api/products/#categoriesget) calls and schema.
  """

  defmodule GetResponse do
    @moduledoc """
    [Plaid API /categories/get response schema.](https://plaid.com/docs/api/products/#categoriesget)
    """

    @behaviour Plaid.Castable

    alias Plaid.Castable
    alias Plaid.Categories.Category

    @type t :: %__MODULE__{
            categories: [Category.t()],
            request_id: String.t()
          }

    defstruct [
      :categories,
      :request_id
    ]

    @impl true
    def cast(generic_map) do
      %__MODULE__{
        categories: Castable.cast_list(Category, generic_map["categories"]),
        request_id: generic_map["request_id"]
      }
    end
  end

  @doc """
  Get information about all Plaid categories.

  Does a `POST /categories/get` call to retrieve a list of all categories.

  > No authentication required.

  ## Example

      Categories.get(env: :production)
      {:ok, %Categories.GetResponse{}}

  """
  @spec get(Plaid.noauth_config()) :: {:ok, GetResponse.t()} | {:error, Plaid.Error.t()}
  def get(config \\ []) do
    Plaid.Client.call(
      "/categories/get",
      %{},
      GetResponse,
      config
    )
  end
end