lib/requests/customers/update.ex

defmodule Requests.Customers.Update do
  alias Customers.Phone

  @derive Jason.Encoder

  @type t() :: %__MODULE__{
          id: String.t(),
          email: String.t(),
          name: String.t(),
          phone: Phone.t(),
          metadata: map(),
          instruments: list(),
          default: String.t()
        }

  @enforce_keys [:id]
  defstruct [
    :id,
    :email,
    :name,
    :phone,
    :metadata,
    :default,
    :instruments
  ]

  def build(%{id: id} = params) when is_binary(id) do
    %__MODULE__{
      id: id,
      email: params[:email],
      name: params[:name],
      phone: Phone.build(params[:phone]),
      metadata: params[:metadata],
      instruments: params[:instruments],
      default: params[:default]
    }
  end

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

  def build(_), do: nil
end