defmodule Requests.Instruments.UpdateCard do 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