Skip to main content

src/proute@generate@pages.erl

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