src/lightspeed@integration@data.erl

-module(lightspeed@integration@data).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/integration/data.gleam").
-export([crud_pattern/0, event_stream_pattern/0, local_dev_pattern/0, valid/1, migration_track_label/1, signature/1, adapter/1, name/1]).
-export_type([migration_track/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(" Data integration patterns for ecosystem compatibility (M26).\n").

-type migration_track() :: dual_write_first |
    read_replica_first |
    big_bang_cutover.

-type pattern() :: {pattern,
        binary(),
        lightspeed@data@repository:adapter(),
        migration_track(),
        boolean(),
        integer(),
        boolean()}.

-file("src/lightspeed/integration/data.gleam", 26).
?DOC(" CRUD-oriented mixed-runtime data pattern.\n").
-spec crud_pattern() -> pattern().
crud_pattern() ->
    {pattern,
        <<"crud_mixed_runtime"/utf8>>,
        {mixed_bridge, <<"MyApp.RepoRead"/utf8>>, <<"MyApp.RepoWrite"/utf8>>},
        dual_write_first,
        true,
        3,
        true}.

-file("src/lightspeed/integration/data.gleam", 41).
?DOC(" Event-stream oriented data pattern.\n").
-spec event_stream_pattern() -> pattern().
event_stream_pattern() ->
    {pattern,
        <<"event_stream_bridge"/utf8>>,
        {elixir_bridge, <<"MyApp.EventStore"/utf8>>},
        read_replica_first,
        true,
        5,
        true}.

-file("src/lightspeed/integration/data.gleam", 53).
?DOC(" In-memory local development fallback pattern.\n").
-spec local_dev_pattern() -> pattern().
local_dev_pattern() ->
    {pattern,
        <<"local_dev_in_memory"/utf8>>,
        gleam_in_memory,
        big_bang_cutover,
        true,
        1,
        true}.

-file("src/lightspeed/integration/data.gleam", 107).
-spec adapter_track_compatible(
    lightspeed@data@repository:adapter(),
    migration_track()
) -> boolean().
adapter_track_compatible(Adapter, Track) ->
    case {Adapter, Track} of
        {gleam_in_memory, big_bang_cutover} ->
            true;

        {gleam_in_memory, _} ->
            false;

        {_, _} ->
            true
    end.

-file("src/lightspeed/integration/data.gleam", 65).
?DOC(" Validate data integration constraints.\n").
-spec valid(pattern()) -> boolean().
valid(Pattern) ->
    ((erlang:element(5, Pattern) andalso (erlang:element(6, Pattern) > 0))
    andalso erlang:element(7, Pattern))
    andalso adapter_track_compatible(
        erlang:element(3, Pattern),
        erlang:element(4, Pattern)
    ).

-file("src/lightspeed/integration/data.gleam", 73).
?DOC(" Stable migration-track label.\n").
-spec migration_track_label(migration_track()) -> binary().
migration_track_label(Track) ->
    case Track of
        dual_write_first ->
            <<"dual_write_first"/utf8>>;

        read_replica_first ->
            <<"read_replica_first"/utf8>>;

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

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

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

-file("src/lightspeed/integration/data.gleam", 82).
?DOC(" Stable pattern signature.\n").
-spec signature(pattern()) -> binary().
signature(Pattern) ->
    <<<<<<<<<<<<<<<<<<<<<<"data:"/utf8, (erlang:element(2, Pattern))/binary>>/binary,
                                            "|adapter="/utf8>>/binary,
                                        (lightspeed@data@repository:adapter_label(
                                            erlang:element(3, Pattern)
                                        ))/binary>>/binary,
                                    "|track="/utf8>>/binary,
                                (migration_track_label(
                                    erlang:element(4, Pattern)
                                ))/binary>>/binary,
                            "|scope_enforced="/utf8>>/binary,
                        (bool_label(erlang:element(5, Pattern)))/binary>>/binary,
                    "|retry_budget="/utf8>>/binary,
                (erlang:integer_to_binary(erlang:element(6, Pattern)))/binary>>/binary,
            "|read_after_write_check="/utf8>>/binary,
        (bool_label(erlang:element(7, Pattern)))/binary>>.

-file("src/lightspeed/integration/data.gleam", 98).
?DOC(" Pattern adapter.\n").
-spec adapter(pattern()) -> lightspeed@data@repository:adapter().
adapter(Pattern) ->
    erlang:element(3, Pattern).

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