-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] -> <<<>/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).