src/lightspeed@integration@mail.erl

-module(lightspeed@integration@mail).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/integration/mail.gleam").
-export([transactional_pattern/0, digest_pattern/0, local_dev_pattern/0, valid/1, backend_label/1, signature/1, backend/1, name/1]).
-export_type([mail_backend/0, delivery_policy/0, pattern/0]).

-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.

?MODULEDOC(" Mail integration patterns for ecosystem compatibility (M26).\n").

-type mail_backend() :: in_memory_outbox |
    {swoosh_bridge, binary()} |
    {mixed_mail, binary(), binary()}.

-type delivery_policy() :: {delivery_policy, integer(), boolean(), boolean()}.

-type pattern() :: {pattern, binary(), mail_backend(), delivery_policy()}.

-file("src/lightspeed/integration/mail.gleam", 27).
?DOC(" Transactional-mail integration pattern.\n").
-spec transactional_pattern() -> pattern().
transactional_pattern() ->
    {pattern,
        <<"transactional_mail"/utf8>>,
        {swoosh_bridge, <<"MyApp.Mailer"/utf8>>},
        {delivery_policy, 5, true, true}}.

-file("src/lightspeed/integration/mail.gleam", 40).
?DOC(" Mixed-runtime digest-mail pattern.\n").
-spec digest_pattern() -> pattern().
digest_pattern() ->
    {pattern,
        <<"digest_mail"/utf8>>,
        {mixed_mail, <<"Swoosh"/utf8>>, <<"GleamOutbox"/utf8>>},
        {delivery_policy, 3, true, true}}.

-file("src/lightspeed/integration/mail.gleam", 53).
?DOC(" Local development mail pattern.\n").
-spec local_dev_pattern() -> pattern().
local_dev_pattern() ->
    {pattern,
        <<"local_dev_mail"/utf8>>,
        in_memory_outbox,
        {delivery_policy, 1, true, true}}.

-file("src/lightspeed/integration/mail.gleam", 106).
-spec backend_valid(mail_backend()) -> boolean().
backend_valid(Backend) ->
    case Backend of
        in_memory_outbox ->
            true;

        {swoosh_bridge, Module} ->
            Module /= <<""/utf8>>;

        {mixed_mail, Primary, Fallback} ->
            (Primary /= <<""/utf8>>) andalso (Fallback /= <<""/utf8>>)
    end.

-file("src/lightspeed/integration/mail.gleam", 66).
?DOC(" Validate mail integration constraints.\n").
-spec valid(pattern()) -> boolean().
valid(Pattern) ->
    ((backend_valid(erlang:element(3, Pattern)) andalso (erlang:element(
        2,
        erlang:element(4, Pattern)
    )
    > 0))
    andalso erlang:element(3, erlang:element(4, Pattern)))
    andalso erlang:element(4, erlang:element(4, Pattern)).

-file("src/lightspeed/integration/mail.gleam", 74).
?DOC(" Stable backend label.\n").
-spec backend_label(mail_backend()) -> binary().
backend_label(Backend) ->
    case Backend of
        in_memory_outbox ->
            <<"in_memory_outbox"/utf8>>;

        {swoosh_bridge, Module} ->
            <<"swoosh_bridge:"/utf8, Module/binary>>;

        {mixed_mail, Primary, Fallback} ->
            <<<<<<"mixed_mail:"/utf8, Primary/binary>>/binary, ":"/utf8>>/binary,
                Fallback/binary>>
    end.

-file("src/lightspeed/integration/mail.gleam", 114).
-spec bool_label(boolean()) -> binary().
bool_label(Value) ->
    case Value of
        true ->
            <<"true"/utf8>>;

        false ->
            <<"false"/utf8>>
    end.

-file("src/lightspeed/integration/mail.gleam", 83).
?DOC(" Stable pattern signature.\n").
-spec signature(pattern()) -> binary().
signature(Pattern) ->
    <<<<<<<<<<<<<<<<<<"mail:"/utf8, (erlang:element(2, Pattern))/binary>>/binary,
                                    "|backend="/utf8>>/binary,
                                (backend_label(erlang:element(3, Pattern)))/binary>>/binary,
                            "|max_retries="/utf8>>/binary,
                        (erlang:integer_to_binary(
                            erlang:element(2, erlang:element(4, Pattern))
                        ))/binary>>/binary,
                    "|idempotency_key_required="/utf8>>/binary,
                (bool_label(erlang:element(3, erlang:element(4, Pattern))))/binary>>/binary,
            "|tenant_header_required="/utf8>>/binary,
        (bool_label(erlang:element(4, erlang:element(4, Pattern))))/binary>>.

-file("src/lightspeed/integration/mail.gleam", 97).
?DOC(" Pattern backend.\n").
-spec backend(pattern()) -> mail_backend().
backend(Pattern) ->
    erlang:element(3, Pattern).

-file("src/lightspeed/integration/mail.gleam", 102).
?DOC(" Pattern name.\n").
-spec name(pattern()) -> binary().
name(Pattern) ->
    erlang:element(2, Pattern).