defmodule Sumup.Customer do @moduledoc "A vaulted SumUp customer, used to store payment instruments for later reuse." @type personal_details :: %{ optional(:first_name) => String.t(), optional(:last_name) => String.t(), optional(:email) => String.t(), optional(:phone) => String.t(), optional(:birth_date) => String.t(), optional(:tax_id) => String.t(), optional(:address) => map() } @type t :: %__MODULE__{ customer_id: String.t(), personal_details: personal_details(), raw: map() } defstruct [:customer_id, personal_details: %{}, raw: %{}] @doc false @spec from_json(map()) :: t() def from_json(json) when is_map(json) do %__MODULE__{ customer_id: json["customer_id"], personal_details: atomize_shallow(json["personal_details"] || %{}), raw: json } end defp atomize_shallow(map) do Map.new(map, fn {k, v} -> {String.to_atom(k), v} end) end end