lib/customers/billing_address.ex

defmodule Customers.BillingAddress do
  import Utilities, only: [atomize_keys: 1]

  @derive Jason.Encoder

  @type t() :: %__MODULE__{
          address_line1: String.t(),
          address_line2: String.t(),
          city: String.t(),
          country: <<_::2>>,
          state: <<_::2>>,
          zip: <<_::50>>
        }

  defstruct [
    :address_line1,
    :address_line2,
    :city,
    :country,
    :state,
    :zip
  ]

  def build(raw_params) when is_map(raw_params) do
    params = atomize_keys(raw_params)

    %__MODULE__{
      address_line1: params[:address_line1],
      address_line2: params[:address_line2],
      city: params[:city],
      country: params[:country],
      state: params[:state],
      zip: params[:zip]
    }
  end

  def build(_), do: nil
end