-module(lightspeed@navigation). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/lightspeed/navigation.gleam"). -export([plan/4, mode/1, boundary/1, instructions/1, mode_label/1, boundary_label/1]). -export_type([navigation_mode/0, mount_boundary/0, navigation_plan/1]). -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(" LiveView-style navigation compatibility planner.\n"). -type navigation_mode() :: live_patch | live_navigate. -type mount_boundary() :: preserve_mount | remount. -type navigation_plan(LPO) :: {navigation_plan, navigation_mode(), mount_boundary(), lightspeed@router:route_match(LPO), lightspeed@router:route_match(LPO), list(lightspeed@agent@isa:instruction())}. -file("src/lightspeed/navigation.gleam", 102). -spec route_view_id(lightspeed@router:route_match(any())) -> binary(). route_view_id(Route_match) -> case Route_match of {found, Matched} -> erlang:element(4, Matched); {not_found, _, View_id} -> View_id end. -file("src/lightspeed/navigation.gleam", 95). -spec same_mount_boundary( lightspeed@router:route_match(LPZ), lightspeed@router:route_match(LPZ) ) -> boolean(). same_mount_boundary(Current, Next) -> route_view_id(Current) =:= route_view_id(Next). -file("src/lightspeed/navigation.gleam", 109). -spec route_path(lightspeed@router:route_match(any())) -> binary(). route_path(Route_match) -> case Route_match of {found, Matched} -> erlang:element(2, Matched); {not_found, Path, _} -> Path end. -file("src/lightspeed/navigation.gleam", 30). ?DOC(" Plan one route transition using LiveView-compatible navigation semantics.\n"). -spec plan(lightspeed@router:router(LPP), binary(), binary(), binary()) -> navigation_plan(LPP). plan(Table, Current_path, Target_path, Csrf_token) -> Current = lightspeed@router:resolve(Table, Current_path), Next = lightspeed@router:resolve(Table, Target_path), Next_path = route_path(Next), case same_mount_boundary(Current, Next) of true -> {navigation_plan, live_patch, preserve_mount, Current, Next, [{navigate, Next_path}]}; false -> {navigation_plan, live_navigate, remount, Current, Next, [{navigate, Next_path} | lightspeed@router:mount_instructions(Next, Csrf_token)]} end. -file("src/lightspeed/navigation.gleam", 65). ?DOC(" Planned mode.\n"). -spec mode(navigation_plan(any())) -> navigation_mode(). mode(Plan) -> erlang:element(2, Plan). -file("src/lightspeed/navigation.gleam", 70). ?DOC(" Planned mount boundary.\n"). -spec boundary(navigation_plan(any())) -> mount_boundary(). boundary(Plan) -> erlang:element(3, Plan). -file("src/lightspeed/navigation.gleam", 75). ?DOC(" Planned route instructions in emit order.\n"). -spec instructions(navigation_plan(any())) -> list(lightspeed@agent@isa:instruction()). instructions(Plan) -> erlang:element(6, Plan). -file("src/lightspeed/navigation.gleam", 80). ?DOC(" Stable mode string for logs and fixtures.\n"). -spec mode_label(navigation_mode()) -> binary(). mode_label(Mode) -> case Mode of live_patch -> <<"patch"/utf8>>; live_navigate -> <<"navigate"/utf8>> end. -file("src/lightspeed/navigation.gleam", 88). ?DOC(" Stable mount boundary string for logs and fixtures.\n"). -spec boundary_label(mount_boundary()) -> binary(). boundary_label(Boundary) -> case Boundary of preserve_mount -> <<"preserve_mount"/utf8>>; remount -> <<"remount"/utf8>> end.