-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 => <<?FILEPATH/utf8>>,
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,
<<<<Module_path@1/binary, "/"/utf8>>/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) -> <<Text/binary, "\n"/utf8>> 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 => <<?FILEPATH/utf8>>,
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>>).