defmodule Plaid.Categories do
@moduledoc """
Functions for Plaid `categories` endpoint.
"""
alias Plaid.Client.Request
alias Plaid.Client
@derive Jason.Encoder
defstruct categories: [], request_id: nil
@type t :: %__MODULE__{categories: [Plaid.Categories.Category.t()], request_id: String.t()}
@type config :: %{required(atom) => String.t() | keyword}
@type error :: {:error, Plaid.Error.t() | any()} | no_return
defmodule Category do
@moduledoc """
Plaid Category data structure.
"""
@derive Jason.Encoder
defstruct category_id: nil, hierarchy: [], group: nil
@type t :: %__MODULE__{category_id: String.t(), hierarchy: list, group: String.t()}
end
@doc """
Gets all categories.
"""
@spec get(config) :: {:ok, Plaid.Categories.t()} | error
def get(config \\ %{}) do
c = config[:client] || Plaid
Request
|> struct(method: :post, endpoint: "categories/get")
|> Request.add_metadata(config)
|> c.send_request(Client.new(config))
|> c.handle_response(&map_categories(&1))
end
defp map_categories(body) do
Poison.Decode.transform(
body,
%{
as: %Plaid.Categories{
categories: [
%Plaid.Categories.Category{}
]
}
}
)
end
end