lib/instruments/bank.ex

defmodule Instruments.Bank do
  import Utilities, only: [atomize_keys: 1]

  alias Customers.BillingAddress

  @derive Jason.Encoder

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

  @type t() :: %__MODULE__{
          address: address(),
          branch: String.t(),
          name: String.t()
        }

  defstruct [
    :address,
    :branch,
    :name
  ]

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

    %__MODULE__{
      address: BillingAddress.build(params[:address]),
      branch: params[:branch],
      name: params[:name]
    }
  end

  def build(_), do: nil
end