lib/requests/payments/sources/token.ex

defmodule Requests.Payments.Sources.Token do
    @moduledoc false

  alias Customers.BillingAddress
  alias Customers.Phone

  import Utilities, only: [atomize_keys: 1]

  @type t :: %__MODULE__{
          type: String.t(),
          token: String.t(),
          billing_address: BillingAddress.t(),
          phone: Phone.t(),
          store_for_future_use: true | false
        }

  @enforce_keys [:type, :token]
  defstruct [
    :type,
    :token,
    :billing_address,
    :phone,
    :store_for_future_use
  ]

  def build(raw_params) when is_map(raw_params) do
    params = atomize_keys(raw_params)

    %{
      type: params[:type],
      token: params[:token],
      billing_address: BillingAddress.build(params[:billing_address]),
      phone: Phone.build(params[:phone]),
      store_for_future_use: params[:store_for_future_use]
    }
  end

  def build(_), do: nil
end