lib/requests/customers/create.ex

defmodule Requests.Customers.Create do
    @moduledoc false
  alias Customers.Phone

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

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

  def build(%{email: email} = params) when is_binary(email) do
    %__MODULE__{
      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, "Create customer must have an email"}

  def build(_), do: nil
end