lib/requests/instruments/update_card.ex

defmodule Requests.Instruments.UpdateCard do
    @moduledoc false
  alias Customers.AccountHolder

  @derive Jason.Encoder

  @type t :: %__MODULE__{
          type: String.t(),
          id: String.t(),
          expiry_month: integer(),
          expiry_year: integer(),
          name: String.t(),
          account_holder: %AccountHolder{},
          customer: %{
            id: String.t(),
            default: true | false
          }
        }

  defstruct [
    :type,
    :id,
    :expiry_month,
    :expiry_year,
    :name,
    :account_holder,
    :customer
  ]

  def build(%{id: id} = params) when is_binary(id) and id != "" do
    %__MODULE__{
      id: id,
      type: params[:type],
      expiry_month: params[:expiry_month],
      expiry_year: params[:expiry_year],
      name: params[:name],
      account_holder: AccountHolder.build(params[:account_holder]),
      customer: build_customer(params[:customer])
    }
  end

  def build(params) when is_map(params), do: {:error, "Card must have an id"}

  def build(_), do: {:error, "params must be a map"}

  defp build_customer(params) when is_map(params) do
    %{
      default: params[:default],
      id: params[:id]
    }
  end

  defp build_customer(_), do: nil
end