Skip to main content

lib/sendgrid/marketing_campaigns/contacts/recipient.ex

defmodule SendGrid.Contacts.Recipient do
  @moduledoc """
  Struct to help with creating a recipient.
  """

  alias SendGrid.Contacts.Recipient

  @enforce_keys [:email]
  defstruct [:custom_fields, :email]

  @type t :: %Recipient{
          email: String.t(),
          custom_fields: nil | map()
        }

  @doc """
  Builds a Repient to be used in `SendGrid.Contacts.Recipents`.
  """
  @spec build(String.t(), map()) :: t()
  def build(email, custom_fields \\ %{}) when is_map(custom_fields) do
    %Recipient{
      email: email,
      custom_fields: custom_fields
    }
  end

  defimpl Jason.Encoder do
    def encode(%Recipient{email: email, custom_fields: fields}, opts) when is_map(fields) do
      Jason.Encode.map(Map.merge(fields, %{email: email}), opts)
    end

    def encode(%Recipient{email: email, custom_fields: nil}, opts) do
      Jason.Encode.map(%{email: email}, opts)
    end
  end
end