-module(proute@generate@pages). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/proute/generate/pages.gleam"). -export([generate/3]). -file("src/proute/generate/pages.gleam", 471). -spec page_alias(proute@discover:page_route()) -> binary(). page_alias(Route) -> proute@names:page_alias(erlang:element(3, Route)). -file("src/proute/generate/pages.gleam", 125). -spec page_constructor_pattern_for_view(proute@discover:page_route()) -> binary(). page_constructor_pattern_for_view(Route) -> case erlang:element(6, Route) of [] -> <<(erlang:element(3, Route))/binary, "Page(page_model)"/utf8>>; _ -> <<(erlang:element(3, Route))/binary, "Page(route_params: _, model: page_model)"/utf8>> end. -file("src/proute/generate/pages.gleam", 403). -spec view_case(proute@validate@pages:page_module()) -> binary(). view_case(Module_) -> Route = erlang:element(2, Module_), <<<<<<<<<<<<<<(page_constructor_pattern_for_view(Route))/binary, " ->\n"/utf8>>/binary, " "/utf8>>/binary, (page_alias(Route))/binary>>/binary, ".view(page_model)\n"/utf8>>/binary, " |> element.map("/utf8>>/binary, (erlang:element(3, Route))/binary>>/binary, "Msg)"/utf8>>. -file("src/proute/generate/pages.gleam", 368). -spec view_function( proute@config:mount(), list(proute@validate@pages:page_module()) ) -> binary(). view_function(Mount, Page_modules) -> <<<<<<<<<<<<<<<<<<<<"/// Render the active "/utf8, (erlang:element(2, Mount))/binary>>/binary, " page.\n"/utf8>>/binary, "///\n"/utf8>>/binary, "/// The mount renders the shell. This generated function renders the selected\n"/utf8>>/binary, "/// page and maps its messages back into the generated page message type.\n"/utf8>>/binary, "pub fn view(page: Page) -> element.Element(Message) {\n"/utf8>>/binary, " case page {\n"/utf8>>/binary, (proute@generate@text:indent_multiline( begin _pipe = Page_modules, _pipe@1 = gleam@list:map(_pipe, fun view_case/1), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, 4 ))/binary>>/binary, "\n }\n"/utf8>>/binary, "}\n"/utf8>>. -file("src/proute/generate/pages.gleam", 139). -spec page_constructor_update_call(proute@discover:page_route(), binary()) -> binary(). page_constructor_update_call(Route, Model_expression) -> case erlang:element(6, Route) of [] -> <<<<<<(erlang:element(3, Route))/binary, "Page("/utf8>>/binary, Model_expression/binary>>/binary, ")"/utf8>>; _ -> <<<<<<(erlang:element(3, Route))/binary, "Page(route_params:, model: "/utf8>>/binary, Model_expression/binary>>/binary, ")"/utf8>> end. -file("src/proute/generate/pages.gleam", 354). -spec update_call(proute@validate@pages:page_module()) -> binary(). update_call(Module_) -> case erlang:element(4, Module_) of true -> <<<<<<" let #(new_model, page_effect) =\n"/utf8, " "/utf8>>/binary, (page_alias(erlang:element(2, Module_)))/binary>>/binary, ".update(page_shared_state, page_model, inner)\n"/utf8>>; false -> <<<<" let #(new_model, page_effect) = "/utf8, (page_alias(erlang:element(2, Module_)))/binary>>/binary, ".update(page_model, inner)\n"/utf8>> end. -file("src/proute/generate/pages.gleam", 132). -spec page_constructor_pattern_for_update(proute@discover:page_route()) -> binary(). page_constructor_pattern_for_update(Route) -> case erlang:element(6, Route) of [] -> <<(erlang:element(3, Route))/binary, "Page(page_model)"/utf8>>; _ -> <<(erlang:element(3, Route))/binary, "Page(route_params:, model: page_model)"/utf8>> end. -file("src/proute/generate/pages.gleam", 280). -spec update_case(proute@validate@pages:page_module()) -> binary(). update_case(Module_) -> Route = erlang:element(2, Module_), <<<<<<<<<<<<<<<<<<<<<<(page_constructor_pattern_for_update(Route))/binary, ", "/utf8>>/binary, (erlang:element(3, Route))/binary>>/binary, "Msg(inner) -> {\n"/utf8>>/binary, (update_call(Module_))/binary>>/binary, " let page = "/utf8>>/binary, (page_constructor_update_call( Route, <<"new_model"/utf8>> ))/binary>>/binary, "\n"/utf8>>/binary, " #(page, effect.map(page_effect, "/utf8>>/binary, (erlang:element(3, Route))/binary>>/binary, "Msg))\n"/utf8>>/binary, "}"/utf8>>. -file("src/proute/generate/pages.gleam", 415). -spec update_context_arg( list(proute@validate@pages:page_module()), proute@names:type_reference() ) -> binary(). update_context_arg(Page_modules, Page_shared_state_type) -> case begin _pipe = Page_modules, gleam@list:any(_pipe, fun(Module_) -> erlang:element(4, Module_) end) end of true -> <<<<" page_shared_state page_shared_state: "/utf8, (erlang:element(3, Page_shared_state_type))/binary>>/binary, ",\n"/utf8>>; false -> <<""/utf8>> end. -file("src/proute/generate/pages.gleam", 388). -spec update_context_comment(list(proute@validate@pages:page_module())) -> binary(). update_context_comment(Page_modules) -> case begin _pipe = Page_modules, gleam@list:any(_pipe, fun(Module_) -> erlang:element(4, Module_) end) end of true -> <<<<"///\n"/utf8, "/// Pages that need shared app facts during update receive `page_shared_state`;\n"/utf8>>/binary, "/// the generated function passes it through without knowing what it contains.\n"/utf8>>; false -> <<""/utf8>> end. -file("src/proute/generate/pages.gleam", 255). -spec update_function( list(proute@validate@pages:page_module()), proute@names:type_reference() ) -> binary(). update_function(Page_modules, Page_shared_state_type) -> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"/// Forward a page message to the page that owns it.\n"/utf8, "///\n"/utf8>>/binary, "/// Messages that arrive for an inactive page are ignored. This is the same guard\n"/utf8>>/binary, "/// a hand-written mount would need, but generated here so user code does not\n"/utf8>>/binary, "/// repeat it for every page.\n"/utf8>>/binary, (update_context_comment( Page_modules ))/binary>>/binary, "pub fn update(\n"/utf8>>/binary, (update_context_arg( Page_modules, Page_shared_state_type ))/binary>>/binary, " page page: Page,\n"/utf8>>/binary, " message message: Message,\n"/utf8>>/binary, ") -> #(Page, Effect(Message)) {\n"/utf8>>/binary, " case page, message {\n"/utf8>>/binary, (proute@generate@text:indent_multiline( begin _pipe = Page_modules, _pipe@1 = gleam@list:map(_pipe, fun update_case/1), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, 4 ))/binary>>/binary, "\n _, _ -> #(page, effect.none())\n"/utf8>>/binary, " }\n"/utf8>>/binary, "}\n"/utf8>>. -file("src/proute/generate/pages.gleam", 111). -spec page_constructor_call(proute@discover:page_route(), binary()) -> binary(). page_constructor_call(Route, Model_expression) -> case erlang:element(6, Route) of [] -> <<<<<<(erlang:element(3, Route))/binary, "Page("/utf8>>/binary, Model_expression/binary>>/binary, ")"/utf8>>; _ -> <<<<<<(erlang:element(3, Route))/binary, "Page(route_params:, model: "/utf8>>/binary, Model_expression/binary>>/binary, ")"/utf8>> end. -file("src/proute/generate/pages.gleam", 324). -spec initial_page_initial_model_call(proute@discover:page_route()) -> binary(). initial_page_initial_model_call(Route) -> case erlang:element(6, Route) of [] -> <<<<" "/utf8, (page_constructor_call( Route, <<(page_alias(Route))/binary, ".initial_model(page_shared_state, query_params)"/utf8>> ))/binary>>/binary, "\n"/utf8>>; _ -> <<<<<<<<<<<<<<<<<<" let page_model = "/utf8, (page_alias(Route))/binary>>/binary, ".initial_model(\n"/utf8>>/binary, " page_shared_state,\n"/utf8>>/binary, " route_params,\n"/utf8>>/binary, " query_params,\n"/utf8>>/binary, " )\n"/utf8>>/binary, " "/utf8>>/binary, (page_constructor_call(Route, <<"page_model"/utf8>>))/binary>>/binary, "\n"/utf8>> end. -file("src/proute/generate/pages.gleam", 449). -spec dynamic_route_params(proute@discover:page_route()) -> binary(). dynamic_route_params(Route) -> case erlang:element(6, Route) of [] -> <<""/utf8>>; Params -> <<<<<<<<" let route_params = page_input."/utf8, (erlang:element(3, Route))/binary>>/binary, "RouteParams("/utf8>>/binary, (begin _pipe = Params, _pipe@1 = gleam@list:map( _pipe, fun(Param) -> <<(erlang:element(2, Param))/binary, ":"/utf8>> end ), gleam@string:join(_pipe@1, <<", "/utf8>>) end)/binary>>/binary, ")\n"/utf8>> end. -file("src/proute/generate/pages.gleam", 435). -spec route_pattern_args(proute@discover:page_route()) -> binary(). route_pattern_args(Route) -> case erlang:element(6, Route) of [] -> <<""/utf8>>; Params -> <<<<"("/utf8, (begin _pipe = Params, _pipe@1 = gleam@list:map( _pipe, fun(Param) -> erlang:element(2, Param) end ), gleam@string:join(_pipe@1, <<", "/utf8>>) end)/binary>>/binary, ")"/utf8>> end. -file("src/proute/generate/pages.gleam", 431). -spec route_pattern(proute@discover:page_route()) -> binary(). route_pattern(Route) -> <<<<"routes."/utf8, (erlang:element(3, Route))/binary>>/binary, (route_pattern_args(Route))/binary>>. -file("src/proute/generate/pages.gleam", 246). -spec initial_page_case(proute@validate@pages:page_module()) -> binary(). initial_page_case(Module_) -> Route = erlang:element(2, Module_), <<<<<<<<(route_pattern(Route))/binary, " -> {\n"/utf8>>/binary, (dynamic_route_params(Route))/binary>>/binary, (initial_page_initial_model_call(Route))/binary>>/binary, "}"/utf8>>. -file("src/proute/generate/pages.gleam", 221). -spec initial_page_function( list(proute@validate@pages:page_module()), proute@names:type_reference() ) -> binary(). initial_page_function(Page_modules, Page_shared_state_type) -> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"/// Build the pure initial page for a route.\n"/utf8, "///\n"/utf8>>/binary, "/// SSR and other fallback paths cannot run Lustre effects, so this dispatcher\n"/utf8>>/binary, "/// always calls the page's pure `initial_model`. Use `load` when browser page\n"/utf8>>/binary, "/// startup effects should run.\n"/utf8>>/binary, "pub fn initial_page(\n"/utf8>>/binary, " page_shared_state page_shared_state: "/utf8>>/binary, (erlang:element( 3, Page_shared_state_type ))/binary>>/binary, ",\n"/utf8>>/binary, " query_params query_params: page_input.QueryParams,\n"/utf8>>/binary, " route route: routes.Route,\n"/utf8>>/binary, ") -> Page {\n"/utf8>>/binary, " case route {\n"/utf8>>/binary, (proute@generate@text:indent_multiline( begin _pipe = Page_modules, _pipe@1 = gleam@list:map(_pipe, fun initial_page_case/1), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, 4 ))/binary>>/binary, "\n }\n"/utf8>>/binary, "}\n"/utf8>>. -file("src/proute/generate/pages.gleam", 305). -spec load_initial_model_call(proute@discover:page_route()) -> binary(). load_initial_model_call(Route) -> case erlang:element(6, Route) of [] -> <<<<<<" let page_model = "/utf8, (page_alias(Route))/binary>>/binary, ".initial_model(page_shared_state, query_params)\n"/utf8>>/binary, " let page_effect = effect.none()\n"/utf8>>; _ -> <<<<<<<<<<<<<<" let page_model = "/utf8, (page_alias(Route))/binary>>/binary, ".initial_model(\n"/utf8>>/binary, " page_shared_state,\n"/utf8>>/binary, " route_params,\n"/utf8>>/binary, " query_params,\n"/utf8>>/binary, " )\n"/utf8>>/binary, " let page_effect = effect.none()\n"/utf8>> end. -file("src/proute/generate/pages.gleam", 347). -spec init_args(proute@discover:page_route()) -> binary(). init_args(Route) -> case erlang:element(6, Route) of [] -> <<"page_shared_state, query_params"/utf8>>; _ -> <<"page_shared_state, route_params, query_params"/utf8>> end. -file("src/proute/generate/pages.gleam", 296). -spec load_init_call(proute@discover:page_route()) -> binary(). load_init_call(Route) -> <<<<<<<<<<" let #(page_model, page_effect) =\n"/utf8, " "/utf8>>/binary, (page_alias(Route))/binary>>/binary, ".init("/utf8>>/binary, (init_args(Route))/binary>>/binary, ")\n"/utf8>>. -file("src/proute/generate/pages.gleam", 204). -spec load_case(proute@validate@pages:page_module()) -> binary(). load_case(Module_) -> Route = erlang:element(2, Module_), <<<<<<<<<<<<<<<<<<(route_pattern(Route))/binary, " -> {\n"/utf8>>/binary, (dynamic_route_params(Route))/binary>>/binary, (case erlang:element(3, Module_) of true -> load_init_call(Route); false -> load_initial_model_call(Route) end)/binary>>/binary, " #("/utf8>>/binary, (page_constructor_call(Route, <<"page_model"/utf8>>))/binary>>/binary, ", effect.map(page_effect, "/utf8>>/binary, (erlang:element(3, Route))/binary>>/binary, "Msg))\n"/utf8>>/binary, "}"/utf8>>. -file("src/proute/generate/pages.gleam", 177). -spec load_function( list(proute@validate@pages:page_module()), proute@names:type_reference() ) -> binary(). load_function(Page_modules, Page_shared_state_type) -> <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"/// Load the page for a route.\n"/utf8, "///\n"/utf8>>/binary, "/// The mount supplies page shared state and structured query params. This generated\n"/utf8>>/binary, "/// function constructs the matching page and wraps its effect. Pages may expose\n"/utf8>>/binary, "/// `init` for client-side startup effects such as browser APIs or page-local\n"/utf8>>/binary, "/// event listeners. When `init` is absent, generated code uses `initial_model`\n"/utf8>>/binary, "/// and `effect.none()`.\n"/utf8>>/binary, "pub fn load(\n"/utf8>>/binary, " page_shared_state page_shared_state: "/utf8>>/binary, (erlang:element( 3, Page_shared_state_type ))/binary>>/binary, ",\n"/utf8>>/binary, " query_params query_params: page_input.QueryParams,\n"/utf8>>/binary, " route route: routes.Route,\n"/utf8>>/binary, ") -> #(Page, Effect(Message)) {\n"/utf8>>/binary, " case route {\n"/utf8>>/binary, (proute@generate@text:indent_multiline( begin _pipe = Page_modules, _pipe@1 = gleam@list:map(_pipe, fun load_case/1), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end, 4 ))/binary>>/binary, "\n }\n"/utf8>>/binary, "}\n"/utf8>>. -file("src/proute/generate/pages.gleam", 170). -spec message_constructor(proute@validate@pages:page_module()) -> binary(). message_constructor(Module_) -> <<<<<<(erlang:element(3, erlang:element(2, Module_)))/binary, "Msg(msg: "/utf8>>/binary, (page_alias(erlang:element(2, Module_)))/binary>>/binary, ".Message)"/utf8>>. -file("src/proute/generate/pages.gleam", 153). -spec message_type( proute@config:mount(), list(proute@validate@pages:page_module()) ) -> binary(). message_type(Mount, Page_modules) -> <<<<<<<<<<<<<<<<"/// Page messages generated from the "/utf8, (erlang:element(2, Mount))/binary>>/binary, " page tree.\n"/utf8>>/binary, "///\n"/utf8>>/binary, "/// The mount receives one generated `Message` type and this module forwards\n"/utf8>>/binary, "/// the inner message to the page that owns it.\n"/utf8>>/binary, "pub type Message {\n"/utf8>>/binary, (proute@generate@text:indent_lines( begin _pipe = Page_modules, _pipe@1 = gleam@list:map(_pipe, fun message_constructor/1), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end ))/binary>>/binary, "\n}\n"/utf8>>. -file("src/proute/generate/pages.gleam", 94). -spec page_constructor(proute@validate@pages:page_module()) -> binary(). page_constructor(Module_) -> Route = erlang:element(2, Module_), case erlang:element(6, Route) of [] -> <<<<<<(erlang:element(3, Route))/binary, "Page(model: "/utf8>>/binary, (page_alias(Route))/binary>>/binary, ".Model)"/utf8>>; _ -> <<<<<<<<<<<<<<<<(erlang:element(3, Route))/binary, "Page(\n"/utf8>>/binary, " route_params: page_input."/utf8>>/binary, (erlang:element(3, Route))/binary>>/binary, "RouteParams,\n"/utf8>>/binary, " model: "/utf8>>/binary, (page_alias(Route))/binary>>/binary, ".Model,\n"/utf8>>/binary, ")"/utf8>> end. -file("src/proute/generate/pages.gleam", 77). -spec page_type( proute@config:mount(), list(proute@validate@pages:page_module()) ) -> binary(). page_type(Mount, Page_modules) -> <<<<<<<<<<<<<<<<"/// Page models generated from the "/utf8, (erlang:element(2, Mount))/binary>>/binary, " page tree.\n"/utf8>>/binary, "///\n"/utf8>>/binary, "/// Each constructor stores the model owned by the matching page module. The\n"/utf8>>/binary, "/// mount can keep one `Page` value without knowing each concrete model type.\n"/utf8>>/binary, "pub type Page {\n"/utf8>>/binary, (proute@generate@text:indent_lines( begin _pipe = Page_modules, _pipe@1 = gleam@list:map(_pipe, fun page_constructor/1), gleam@string:join(_pipe@1, <<"\n"/utf8>>) end ))/binary>>/binary, "\n}\n"/utf8>>. -file("src/proute/generate/pages.gleam", 465). -spec generated_module_path(proute@config:mount(), binary()) -> binary(). generated_module_path(Mount, Module_name) -> Module_path@1 = case proute@names:module_path_from_output_dir( erlang:element(5, Mount) ) of {ok, Module_path} -> Module_path; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"proute/generate/pages"/utf8>>, function => <<"generated_module_path"/utf8>>, line => 466, value => _assert_fail, start => 12765, 'end' => 12849, pattern_start => 12776, pattern_end => 12791}) end, <<<>/binary, Module_name/binary>>. -file("src/proute/generate/pages.gleam", 49). -spec imports( proute@config:mount(), list(proute@validate@pages:page_module()), proute@names:type_reference() ) -> binary(). imports(Mount, Page_modules, Page_shared_state_type) -> _pipe@1 = [<<"import "/utf8, (generated_module_path(Mount, <<"page_input"/utf8>>))/binary>>, <<"import "/utf8, (generated_module_path(Mount, <<"routes"/utf8>>))/binary>>, <<"import lustre/effect.{type Effect}"/utf8>>, <<"import lustre/element"/utf8>>, <<<<<<<<"import "/utf8, (erlang:element(2, Page_shared_state_type))/binary>>/binary, ".{type "/utf8>>/binary, (erlang:element(3, Page_shared_state_type))/binary>>/binary, "}"/utf8>> | begin _pipe = Page_modules, gleam@list:map( _pipe, fun(Module_) -> <<<<<<"import "/utf8, (erlang:element(8, erlang:element(2, Module_)))/binary>>/binary, " as "/utf8>>/binary, (page_alias(erlang:element(2, Module_)))/binary>> end ) end], _pipe@2 = gleam@list:sort(_pipe@1, fun gleam@string:compare/2), _pipe@3 = gleam@string:join(_pipe@2, <<"\n"/utf8>>), (fun(Text) -> <> end)(_pipe@3). -file("src/proute/generate/pages.gleam", 31). -spec header(proute@config:mount()) -> binary(). header(Mount) -> <<<<<<<<<<<<<<<<<<<<<<<<<<<<"//// Generated Lustre page glue. Do not edit.\n"/utf8, "////\n"/utf8>>/binary, "//// mount: "/utf8>>/binary, (erlang:element(2, Mount))/binary>>/binary, "\n"/utf8>>/binary, "//// pages: "/utf8>>/binary, (erlang:element(3, Mount))/binary>>/binary, "\n"/utf8>>/binary, "//// route_root: "/utf8>>/binary, (erlang:element(4, Mount))/binary>>/binary, "\n"/utf8>>/binary, "////\n"/utf8>>/binary, "//// This module is the generated bridge between route values and page modules.\n"/utf8>>/binary, "//// It owns the repetitive Lustre wiring: page unions, page messages, loading\n"/utf8>>/binary, "//// dispatch, update forwarding, and rendering dispatch.\n"/utf8>>. -file("src/proute/generate/pages.gleam", 9). -spec generate( proute@discover:mount_routes(), list(proute@validate@pages:page_module()), binary() ) -> binary(). generate(Mount_routes, Page_modules, Page_shared_state_type) -> {mount_routes, Mount, _} = Mount_routes, Page_shared_state@1 = case proute@names:parse_type_reference( Page_shared_state_type ) of {ok, Page_shared_state} -> Page_shared_state; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"proute/generate/pages"/utf8>>, function => <<"generate"/utf8>>, line => 15, value => _assert_fail, start => 388, 'end' => 477, pattern_start => 399, pattern_end => 420}) end, _pipe = [header(Mount), imports(Mount, Page_modules, Page_shared_state@1), page_type(Mount, Page_modules), message_type(Mount, Page_modules), load_function(Page_modules, Page_shared_state@1), initial_page_function(Page_modules, Page_shared_state@1), update_function(Page_modules, Page_shared_state@1), view_function(Mount, Page_modules)], gleam@string:join(_pipe, <<"\n"/utf8>>).