lib/requests/payments/sources/network_token.ex

defmodule Requests.Payments.Sources.NetworkToken do
    @moduledoc false
  alias Customers.BillingAddress
  alias Customers.Phone

  @type t :: %__MODULE__{
          type: String.t(),
          token: String.t(),
          expiry_month: integer(),
          expiry_year: integer(),
          token_type: String.t(),
          cryptogram: String.t(),
          eci: String.t(),
          stored: true | false,
          name: String.t(),
          cvv: String.t(),
          billing_address: BillingAddress.t(),
          phone: Phone.t()
        }

  @enforce_keys [:type, :token, :expiry_month, :expiry_year, :token_type, :cryptogram, :eci]
  defstruct [
    :type,
    :token,
    :expiry_month,
    :expiry_year,
    :token_type,
    :cryptogram,
    :eci,
    :stored,
    :name,
    :cvv,
    :billing_address,
    :phone
  ]

  def build(raw_params) when is_map(raw_params) do
    params =
      Enum.into(raw_params, %{}, fn {key, value} -> {String.to_existing_atom(key), value} end)

    %{
      type: params[:type],
      token: params[:token],
      expiry_month: params[:expiry_month],
      expiry_year: params[:expiry_year],
      token_type: params[:token_type],
      cryptogram: params[:cryptogram],
      eci: params[:eci],
      stored: params[:stored],
      name: params[:name],
      cvv: params[:cvv],
      billing_address: BillingAddress.build(params[:billing_address]),
      phone: Phone.build(params[:phone])
    }
  end

  def build(_), do: nil
end