src/lightspeed@data@migration.erl

-module(lightspeed@data@migration).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/lightspeed/data/migration.gleam").
-export([small_reference_plan/0, medium_reference_plan/0, valid/1, step_label/1, mode_label/1, size_label/1, signature/1, name/1, steps/1, rollback_steps/1, adapters/1]).
-export_type([size_profile/0, deployment_mode/0, step/0, reference_plan/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(" Reference migration plans for Phoenix/LiveView to Lightspeed adoption.\n").

-type size_profile() :: small | medium.

-type deployment_mode() :: legacy_phoenix | mixed_runtime | lightspeed_primary.

-type step() :: snapshot_legacy_data |
    introduce_scoped_repository |
    enable_dual_write_bridge |
    verify_tenant_parity |
    shift_read_path_to_lightspeed |
    shift_write_path_to_lightspeed |
    enable_lightspeed_runtime |
    rollback_to_legacy.

-type reference_plan() :: {reference_plan,
        binary(),
        size_profile(),
        deployment_mode(),
        list(lightspeed@data@repository:adapter()),
        list(step()),
        list(step())}.

-file("src/lightspeed/data/migration.gleam", 44).
?DOC(" Small-app reference migration.\n").
-spec small_reference_plan() -> reference_plan().
small_reference_plan() ->
    {reference_plan,
        <<"small-phx-liveview-to-lightspeed"/utf8>>,
        small,
        mixed_runtime,
        [{elixir_bridge, <<"MySmallApp.Repo"/utf8>>}, gleam_in_memory],
        [snapshot_legacy_data,
            introduce_scoped_repository,
            enable_dual_write_bridge,
            verify_tenant_parity,
            shift_read_path_to_lightspeed,
            enable_lightspeed_runtime],
        [rollback_to_legacy]}.

-file("src/lightspeed/data/migration.gleam", 66).
?DOC(" Medium-app reference migration.\n").
-spec medium_reference_plan() -> reference_plan().
medium_reference_plan() ->
    {reference_plan,
        <<"medium-phx-liveview-to-lightspeed"/utf8>>,
        medium,
        mixed_runtime,
        [{mixed_bridge,
                <<"MyMediumApp.RepoRead"/utf8>>,
                <<"MyMediumApp.RepoWrite"/utf8>>},
            {elixir_bridge, <<"MyMediumApp.Repo"/utf8>>}],
        [snapshot_legacy_data,
            introduce_scoped_repository,
            enable_dual_write_bridge,
            verify_tenant_parity,
            shift_read_path_to_lightspeed,
            shift_write_path_to_lightspeed,
            enable_lightspeed_runtime],
        [rollback_to_legacy]}.

-file("src/lightspeed/data/migration.gleam", 168).
-spec has_step(list(step()), step()) -> boolean().
has_step(Steps, Expected) ->
    case Steps of
        [] ->
            false;

        [Step | Rest] ->
            case Step =:= Expected of
                true ->
                    true;

                false ->
                    has_step(Rest, Expected)
            end
    end.

-file("src/lightspeed/data/migration.gleam", 92).
?DOC(" Validate migration plan essentials.\n").
-spec valid(reference_plan()) -> boolean().
valid(Plan) ->
    ((((has_step(erlang:element(6, Plan), snapshot_legacy_data) andalso has_step(
        erlang:element(6, Plan),
        introduce_scoped_repository
    ))
    andalso has_step(erlang:element(6, Plan), enable_dual_write_bridge))
    andalso has_step(erlang:element(6, Plan), verify_tenant_parity))
    andalso has_step(erlang:element(6, Plan), enable_lightspeed_runtime))
    andalso has_step(erlang:element(7, Plan), rollback_to_legacy).

-file("src/lightspeed/data/migration.gleam", 140).
?DOC(" Step label.\n").
-spec step_label(step()) -> binary().
step_label(Step) ->
    case Step of
        snapshot_legacy_data ->
            <<"snapshot_legacy_data"/utf8>>;

        introduce_scoped_repository ->
            <<"introduce_scoped_repository"/utf8>>;

        enable_dual_write_bridge ->
            <<"enable_dual_write_bridge"/utf8>>;

        verify_tenant_parity ->
            <<"verify_tenant_parity"/utf8>>;

        shift_read_path_to_lightspeed ->
            <<"shift_read_path_to_lightspeed"/utf8>>;

        shift_write_path_to_lightspeed ->
            <<"shift_write_path_to_lightspeed"/utf8>>;

        enable_lightspeed_runtime ->
            <<"enable_lightspeed_runtime"/utf8>>;

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

-file("src/lightspeed/data/migration.gleam", 179).
-spec join_with(binary(), list(binary())) -> binary().
join_with(Separator, Values) ->
    case Values of
        [] ->
            <<""/utf8>>;

        [Value] ->
            Value;

        [Value@1 | Rest] ->
            <<<<Value@1/binary, Separator/binary>>/binary,
                (join_with(Separator, Rest))/binary>>
    end.

-file("src/lightspeed/data/migration.gleam", 131).
?DOC(" Plan deployment-mode label.\n").
-spec mode_label(deployment_mode()) -> binary().
mode_label(Mode) ->
    case Mode of
        legacy_phoenix ->
            <<"legacy_phoenix"/utf8>>;

        mixed_runtime ->
            <<"mixed_runtime"/utf8>>;

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

-file("src/lightspeed/data/migration.gleam", 123).
?DOC(" Plan size label.\n").
-spec size_label(size_profile()) -> binary().
size_label(Size) ->
    case Size of
        small ->
            <<"small"/utf8>>;

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

-file("src/lightspeed/data/migration.gleam", 102).
?DOC(" Stable plan signature for fixtures and docs.\n").
-spec signature(reference_plan()) -> binary().
signature(Plan) ->
    <<<<<<<<<<<<<<<<<<<<<<"m19:"/utf8,
                                                (size_label(
                                                    erlang:element(3, Plan)
                                                ))/binary>>/binary,
                                            ":"/utf8>>/binary,
                                        (mode_label(erlang:element(4, Plan)))/binary>>/binary,
                                    "|name="/utf8>>/binary,
                                (erlang:element(2, Plan))/binary>>/binary,
                            "|adapters="/utf8>>/binary,
                        (join_with(
                            <<","/utf8>>,
                            gleam@list:map(
                                erlang:element(5, Plan),
                                fun lightspeed@data@repository:adapter_label/1
                            )
                        ))/binary>>/binary,
                    "|steps="/utf8>>/binary,
                (join_with(
                    <<","/utf8>>,
                    gleam@list:map(erlang:element(6, Plan), fun step_label/1)
                ))/binary>>/binary,
            "|rollback="/utf8>>/binary,
        (join_with(
            <<","/utf8>>,
            gleam@list:map(erlang:element(7, Plan), fun step_label/1)
        ))/binary>>.

-file("src/lightspeed/data/migration.gleam", 118).
?DOC(" Plan name.\n").
-spec name(reference_plan()) -> binary().
name(Plan) ->
    erlang:element(2, Plan).

-file("src/lightspeed/data/migration.gleam", 154).
?DOC(" Plan steps in execution order.\n").
-spec steps(reference_plan()) -> list(step()).
steps(Plan) ->
    erlang:element(6, Plan).

-file("src/lightspeed/data/migration.gleam", 159).
?DOC(" Rollback steps in execution order.\n").
-spec rollback_steps(reference_plan()) -> list(step()).
rollback_steps(Plan) ->
    erlang:element(7, Plan).

-file("src/lightspeed/data/migration.gleam", 164).
?DOC(" Adapters participating in the plan.\n").
-spec adapters(reference_plan()) -> list(lightspeed@data@repository:adapter()).
adapters(Plan) ->
    erlang:element(5, Plan).