Skip to main content

src/proute@generate@routes.erl

-module(proute@generate@routes).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/proute/generate/routes.gleam").
-export([generate/1]).

-file("src/proute/generate/routes.gleam", 474).
-spec trim_trailing_slash() -> binary().
trim_trailing_slash() ->
    <<<<<<<<<<<<"fn trim_trailing_slash(origin: String) -> String {\n"/utf8,
                            "  use <- bool.guard(\n"/utf8>>/binary,
                        "    when: string.ends_with(origin, \"/\") == False,\n"/utf8>>/binary,
                    "    return: origin,\n"/utf8>>/binary,
                "  )\n"/utf8>>/binary,
            "  string.drop_end(origin, 1)\n"/utf8>>/binary,
        "}\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 525).
-spec has_dynamic_routes(list(proute@discover:page_route())) -> boolean().
has_dynamic_routes(Routes) ->
    _pipe = Routes,
    gleam@list:any(_pipe, fun(Route) -> erlang:element(6, Route) /= [] end).

-file("src/proute/generate/routes.gleam", 461).
-spec percent_decode(list(proute@discover:page_route())) -> binary().
percent_decode(Routes) ->
    case has_dynamic_routes(Routes) of
        false ->
            <<""/utf8>>;

        true ->
            <<<<<<<<<<"fn percent_decode(value: String) -> Result(String, Nil) {\n"/utf8,
                                "  case uri.percent_decode(value) {\n"/utf8>>/binary,
                            "    Ok(decoded) -> Ok(decoded)\n"/utf8>>/binary,
                        "    Error(_) -> Error(Nil)\n"/utf8>>/binary,
                    "  }\n"/utf8>>/binary,
                "}\n"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 381).
-spec helper_params(proute@discover:page_route()) -> binary().
helper_params(Route) ->
    _pipe = erlang:element(6, Route),
    _pipe@1 = gleam@list:map(
        _pipe,
        fun(Param) ->
            <<<<<<<<(erlang:element(2, Param))/binary, " "/utf8>>/binary,
                        (erlang:element(2, Param))/binary>>/binary,
                    ": "/utf8>>/binary,
                (erlang:element(3, Param))/binary>>
        end
    ),
    gleam@string:join(_pipe@1, <<", "/utf8>>).

-file("src/proute/generate/routes.gleam", 395).
-spec url_params(proute@discover:page_route()) -> binary().
url_params(Route) ->
    case helper_params(Route) of
        <<""/utf8>> ->
            <<"origin origin: String"/utf8>>;

        Params ->
            <<Params/binary, ", origin origin: String"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 448).
-spec plain_route_name(proute@discover:page_route()) -> binary().
plain_route_name(Route) ->
    _pipe = erlang:element(3, Route),
    _pipe@1 = proute@names:snake_case(_pipe),
    gleam@string:replace(_pipe@1, <<"_"/utf8>>, <<" "/utf8>>).

-file("src/proute/generate/routes.gleam", 440).
-spec route_label(proute@config:mount(), proute@discover:page_route()) -> binary().
route_label(Mount, Route) ->
    case erlang:element(2, Route) of
        home ->
            <<(erlang:element(2, Mount))/binary, " homepage"/utf8>>;

        not_found ->
            <<(erlang:element(2, Mount))/binary, " not-found"/utf8>>;

        _ ->
            plain_route_name(Route)
    end.

-file("src/proute/generate/routes.gleam", 389).
-spec helper_args(proute@discover:page_route()) -> binary().
helper_args(Route) ->
    _pipe = erlang:element(6, Route),
    _pipe@1 = gleam@list:map(
        _pipe,
        fun(Param) -> <<(erlang:element(2, Param))/binary, ":"/utf8>> end
    ),
    gleam@string:join(_pipe@1, <<", "/utf8>>).

-file("src/proute/generate/routes.gleam", 402).
-spec constructor_args(proute@discover:page_route()) -> binary().
constructor_args(Route) ->
    case helper_args(Route) of
        <<""/utf8>> ->
            <<""/utf8>>;

        Args ->
            <<<<"("/utf8, Args/binary>>/binary, ")"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 416).
-spec path_helper_comment(proute@config:mount(), proute@discover:page_route()) -> binary().
path_helper_comment(Mount, Route) ->
    case erlang:element(2, Route) of
        not_found ->
            <<<<"Build the canonical "/utf8, (erlang:element(2, Mount))/binary>>/binary,
                " not-found path."/utf8>>;

        _ ->
            case erlang:element(6, Route) of
                [] ->
                    <<<<"Build the "/utf8, (plain_route_name(Route))/binary>>/binary,
                        " path."/utf8>>;

                [Param] ->
                    <<<<<<<<"Build the "/utf8,
                                    (plain_route_name(Route))/binary>>/binary,
                                " path, percent-encoding `"/utf8>>/binary,
                            (erlang:element(2, Param))/binary>>/binary,
                        "`."/utf8>>;

                _ ->
                    <<<<"Build the "/utf8, (plain_route_name(Route))/binary>>/binary,
                        " path, percent-encoding its parameters."/utf8>>
            end
    end.

-file("src/proute/generate/routes.gleam", 377).
-spec helper_name(proute@discover:page_route()) -> binary().
helper_name(Route) ->
    proute@names:helper_name(erlang:element(3, Route)).

-file("src/proute/generate/routes.gleam", 328).
-spec helper(proute@config:mount(), proute@discover:page_route()) -> binary().
helper(Mount, Route) ->
    Name = helper_name(Route),
    Params = helper_params(Route),
    Args = helper_args(Route),
    Path_comment = path_helper_comment(Mount, Route),
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"/// Construct the "/utf8,
                                                                                                                                                                    (route_label(
                                                                                                                                                                        Mount,
                                                                                                                                                                        Route
                                                                                                                                                                    ))/binary>>/binary,
                                                                                                                                                                " route.\n"/utf8>>/binary,
                                                                                                                                                            "pub fn "/utf8>>/binary,
                                                                                                                                                        Name/binary>>/binary,
                                                                                                                                                    "_route("/utf8>>/binary,
                                                                                                                                                Params/binary>>/binary,
                                                                                                                                            ") -> Route {\n"/utf8>>/binary,
                                                                                                                                        "  "/utf8>>/binary,
                                                                                                                                    (erlang:element(
                                                                                                                                        3,
                                                                                                                                        Route
                                                                                                                                    ))/binary>>/binary,
                                                                                                                                (constructor_args(
                                                                                                                                    Route
                                                                                                                                ))/binary>>/binary,
                                                                                                                            "\n"/utf8>>/binary,
                                                                                                                        "}\n\n"/utf8>>/binary,
                                                                                                                    "/// "/utf8>>/binary,
                                                                                                                Path_comment/binary>>/binary,
                                                                                                            "\n"/utf8>>/binary,
                                                                                                        "pub fn "/utf8>>/binary,
                                                                                                    Name/binary>>/binary,
                                                                                                "_path("/utf8>>/binary,
                                                                                            Params/binary>>/binary,
                                                                                        ") -> String {\n"/utf8>>/binary,
                                                                                    "  route_to_path("/utf8>>/binary,
                                                                                Name/binary>>/binary,
                                                                            "_route("/utf8>>/binary,
                                                                        Args/binary>>/binary,
                                                                    "))\n"/utf8>>/binary,
                                                                "}\n\n"/utf8>>/binary,
                                                            "/// Build an absolute URL for the "/utf8>>/binary,
                                                        (route_label(
                                                            Mount,
                                                            Route
                                                        ))/binary>>/binary,
                                                    " route.\n"/utf8>>/binary,
                                                "pub fn "/utf8>>/binary,
                                            Name/binary>>/binary,
                                        "_url("/utf8>>/binary,
                                    (url_params(Route))/binary>>/binary,
                                ") -> String {\n"/utf8>>/binary,
                            "  route_to_url(route: "/utf8>>/binary,
                        Name/binary>>/binary,
                    "_route("/utf8>>/binary,
                Args/binary>>/binary,
            "), origin:)\n"/utf8>>/binary,
        "}\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 322).
-spec helpers(proute@config:mount(), list(proute@discover:page_route())) -> binary().
helpers(Mount, Routes) ->
    _pipe = Routes,
    _pipe@1 = gleam@list:map(
        _pipe,
        fun(_capture) -> helper(Mount, _capture) end
    ),
    gleam@string:join(_pipe@1, <<"\n"/utf8>>).

-file("src/proute/generate/routes.gleam", 454).
-spec article(binary()) -> binary().
article(Word) ->
    case begin
        _pipe = Word,
        _pipe@1 = string:lowercase(_pipe),
        gleam@string:to_graphemes(_pipe@1)
    end of
        [<<"a"/utf8>> | _] ->
            <<"an"/utf8>>;

        [<<"e"/utf8>> | _] ->
            <<"an"/utf8>>;

        [<<"i"/utf8>> | _] ->
            <<"an"/utf8>>;

        [<<"o"/utf8>> | _] ->
            <<"an"/utf8>>;

        [<<"u"/utf8>> | _] ->
            <<"an"/utf8>>;

        _ ->
            <<"a"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 306).
-spec route_to_url(proute@config:mount()) -> binary().
route_to_url(Mount) ->
    <<<<<<<<<<<<<<<<<<<<<<<<"/// Build an absolute URL for "/utf8,
                                                    (article(
                                                        erlang:element(2, Mount)
                                                    ))/binary>>/binary,
                                                " "/utf8>>/binary,
                                            (erlang:element(2, Mount))/binary>>/binary,
                                        " route.\n"/utf8>>/binary,
                                    "///\n"/utf8>>/binary,
                                "/// `origin` must be the explicit scheme and authority, such as\n"/utf8>>/binary,
                            "/// `https://example.com` or `http://localhost:8080`. One trailing slash is\n"/utf8>>/binary,
                        "/// trimmed before appending the route path. The generated module does not\n"/utf8>>/binary,
                    "/// guess the origin from request headers because that policy belongs to the app.\n"/utf8>>/binary,
                "pub fn route_to_url(route route: Route, origin origin: String) -> String {\n"/utf8>>/binary,
            "  trim_trailing_slash(origin) <> route_to_path(route)\n"/utf8>>/binary,
        "}\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 299).
-spec join_path_expression(list(binary())) -> binary().
join_path_expression(Segments) ->
    case Segments of
        [] ->
            gleam@string:inspect(<<"/"/utf8>>);

        _ ->
            _pipe = Segments,
            gleam@string:join(_pipe, <<" <> "/utf8>>)
    end.

-file("src/proute/generate/routes.gleam", 269).
-spec path_expression_segments(list(binary()), binary(), list(binary())) -> list(binary()).
path_expression_segments(Segments, Static_prefix, Built) ->
    case Segments of
        [] ->
            case Static_prefix of
                <<""/utf8>> ->
                    lists:reverse(Built);

                _ ->
                    lists:reverse([gleam@string:inspect(Static_prefix) | Built])
            end;

        [Segment | Rest] ->
            case gleam_stdlib:string_starts_with(Segment, <<":"/utf8>>) of
                true ->
                    Built@1 = case Static_prefix of
                        <<""/utf8>> ->
                            Built;

                        _ ->
                            [gleam@string:inspect(
                                    <<Static_prefix/binary, "/"/utf8>>
                                ) |
                                Built]
                    end,
                    Param = gleam@string:drop_start(Segment, 1),
                    path_expression_segments(
                        Rest,
                        <<""/utf8>>,
                        [<<<<"uri.percent_encode("/utf8, Param/binary>>/binary,
                                ")"/utf8>> |
                            Built@1]
                    );

                false ->
                    path_expression_segments(
                        Rest,
                        <<<<Static_prefix/binary, "/"/utf8>>/binary,
                            Segment/binary>>,
                        Built
                    )
            end
    end.

-file("src/proute/generate/routes.gleam", 261).
-spec route_path_expression(proute@discover:page_route()) -> binary().
route_path_expression(Route) ->
    _pipe = erlang:element(4, Route),
    _pipe@1 = gleam@string:split(_pipe, <<"/"/utf8>>),
    _pipe@2 = gleam@list:filter(
        _pipe@1,
        fun(Segment) -> Segment /= <<""/utf8>> end
    ),
    _pipe@3 = path_expression_segments(_pipe@2, <<""/utf8>>, []),
    join_path_expression(_pipe@3).

-file("src/proute/generate/routes.gleam", 409).
-spec constructor_pattern(proute@discover:page_route()) -> binary().
constructor_pattern(Route) ->
    case helper_args(Route) of
        <<""/utf8>> ->
            erlang:element(3, Route);

        Args ->
            <<<<<<(erlang:element(3, Route))/binary, "("/utf8>>/binary,
                    Args/binary>>/binary,
                ")"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 252).
-spec route_to_path_case(proute@discover:page_route()) -> binary().
route_to_path_case(Route) ->
    Pattern = constructor_pattern(Route),
    case erlang:element(6, Route) of
        [] ->
            <<<<Pattern/binary, " -> "/utf8>>/binary,
                (gleam@string:inspect(erlang:element(4, Route)))/binary>>;

        _ ->
            <<<<Pattern/binary, " -> "/utf8>>/binary,
                (route_path_expression(Route))/binary>>
    end.

-file("src/proute/generate/routes.gleam", 236).
-spec route_to_path_comment(
    proute@config:mount(),
    list(proute@discover:page_route())
) -> binary().
route_to_path_comment(Mount, Routes) ->
    Base = [<<"`NotFound` points to the canonical not-found path declared by"/utf8>>,
        <<"`not_found_.gleam`, which keeps 404 links from pretending to be the"/utf8>>,
        <<(erlang:element(2, Mount))/binary, " homepage."/utf8>>],
    case has_dynamic_routes(Routes) of
        true ->
            proute@generate@text:doc_lines(
                [<<"Dynamic parameters are percent-encoded."/utf8>> | Base]
            );

        false ->
            proute@generate@text:doc_lines(Base)
    end.

-file("src/proute/generate/routes.gleam", 218).
-spec route_to_path(proute@config:mount(), list(proute@discover:page_route())) -> binary().
route_to_path(Mount, Routes) ->
    <<<<<<<<<<<<<<<<<<<<<<"/// Convert "/utf8,
                                                (article(
                                                    erlang:element(2, Mount)
                                                ))/binary>>/binary,
                                            " "/utf8>>/binary,
                                        (erlang:element(2, Mount))/binary>>/binary,
                                    " route value into its canonical path.\n"/utf8>>/binary,
                                "///\n"/utf8>>/binary,
                            (route_to_path_comment(Mount, Routes))/binary>>/binary,
                        "pub fn route_to_path(route: Route) -> String {\n"/utf8>>/binary,
                    "  case route {\n"/utf8>>/binary,
                (proute@generate@text:indent_multiline(
                    begin
                        _pipe = Routes,
                        _pipe@1 = gleam@list:map(
                            _pipe,
                            fun route_to_path_case/1
                        ),
                        gleam@string:join(_pipe@1, <<"\n"/utf8>>)
                    end,
                    4
                ))/binary>>/binary,
            "\n  }\n"/utf8>>/binary,
        "}\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 185).
-spec nested_dynamic_decode(
    proute@discover:page_route(),
    list(proute@discover:route_param()),
    list(binary())
) -> binary().
nested_dynamic_decode(Route, Params, Decoded) ->
    case Params of
        [] ->
            <<<<<<(erlang:element(3, Route))/binary, "("/utf8>>/binary,
                    (begin
                        _pipe = Decoded,
                        _pipe@1 = lists:reverse(_pipe),
                        _pipe@2 = gleam@list:map(
                            _pipe@1,
                            fun(Name) -> <<Name/binary, ":"/utf8>> end
                        ),
                        gleam@string:join(_pipe@2, <<", "/utf8>>)
                    end)/binary>>/binary,
                ")"/utf8>>;

        [Param | Rest] ->
            <<<<<<<<<<<<<<<<<<"case percent_decode("/utf8,
                                                (erlang:element(2, Param))/binary>>/binary,
                                            ") {\n"/utf8>>/binary,
                                        "  Ok("/utf8>>/binary,
                                    (erlang:element(2, Param))/binary>>/binary,
                                ") -> "/utf8>>/binary,
                            (proute@generate@text:indent_multiline(
                                nested_dynamic_decode(
                                    Route,
                                    Rest,
                                    [erlang:element(2, Param) | Decoded]
                                ),
                                2
                            ))/binary>>/binary,
                        "\n"/utf8>>/binary,
                    "  Error(Nil) -> NotFound\n"/utf8>>/binary,
                "}"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 166).
-spec dynamic_decode(proute@discover:page_route()) -> binary().
dynamic_decode(Route) ->
    case erlang:element(6, Route) of
        [Param] ->
            <<<<<<<<<<<<<<<<<<<<<<"case percent_decode("/utf8,
                                                        (erlang:element(
                                                            2,
                                                            Param
                                                        ))/binary>>/binary,
                                                    ") {\n"/utf8>>/binary,
                                                "  Ok("/utf8>>/binary,
                                            (erlang:element(2, Param))/binary>>/binary,
                                        ") -> "/utf8>>/binary,
                                    (erlang:element(3, Route))/binary>>/binary,
                                "("/utf8>>/binary,
                            (erlang:element(2, Param))/binary>>/binary,
                        ":)\n"/utf8>>/binary,
                    "  Error(Nil) -> NotFound\n"/utf8>>/binary,
                "}"/utf8>>;

        Params ->
            nested_dynamic_decode(Route, Params, [])
    end.

-file("src/proute/generate/routes.gleam", 512).
-spec parse_pattern_segment(proute@discover:route_segment()) -> binary().
parse_pattern_segment(Segment) ->
    case Segment of
        {static_segment, Value} ->
            gleam@string:inspect(Value);

        {dynamic_segment, Name} ->
            Name
    end.

-file("src/proute/generate/routes.gleam", 498).
-spec segment_pattern_without_rest(list(proute@discover:route_segment())) -> binary().
segment_pattern_without_rest(Segments) ->
    case Segments of
        [] ->
            <<"[]"/utf8>>;

        _ ->
            <<<<"["/utf8,
                    (begin
                        _pipe = Segments,
                        _pipe@1 = gleam@list:map(
                            _pipe,
                            fun parse_pattern_segment/1
                        ),
                        gleam@string:join(_pipe@1, <<", "/utf8>>)
                    end)/binary>>/binary,
                "]"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 153).
-spec parse_case(proute@discover:page_route()) -> binary().
parse_case(Route) ->
    case erlang:element(6, Route) of
        [] ->
            <<<<(segment_pattern_without_rest(erlang:element(5, Route)))/binary,
                    " -> "/utf8>>/binary,
                (erlang:element(3, Route))/binary>>;

        _ ->
            <<<<(segment_pattern_without_rest(erlang:element(5, Route)))/binary,
                    " ->\n"/utf8>>/binary,
                (proute@generate@text:indent_lines(dynamic_decode(Route)))/binary>>
    end.

-file("src/proute/generate/routes.gleam", 141).
-spec parse_function(list(proute@discover:page_route())) -> binary().
parse_function(Routes) ->
    <<<<<<<<<<"fn parse(segments: List(String)) -> Route {\n"/utf8,
                        "  case segments {\n"/utf8>>/binary,
                    (proute@generate@text:indent_multiline(
                        begin
                            _pipe = Routes,
                            _pipe@1 = gleam@list:map(_pipe, fun parse_case/1),
                            gleam@string:join(_pipe@1, <<"\n"/utf8>>)
                        end,
                        4
                    ))/binary>>/binary,
                "\n    _ -> NotFound\n"/utf8>>/binary,
            "  }\n"/utf8>>/binary,
        "}\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 484).
-spec segment_pattern(list(binary())) -> binary().
segment_pattern(Segments) ->
    case Segments of
        [] ->
            <<"[..rest]"/utf8>>;

        _ ->
            <<<<"["/utf8,
                    (begin
                        _pipe = Segments,
                        _pipe@1 = gleam@list:map(
                            _pipe,
                            fun gleam@string:inspect/1
                        ),
                        gleam@string:join(_pipe@1, <<", "/utf8>>)
                    end)/binary>>/binary,
                ", ..rest]"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 519).
-spec route_root_segments(binary()) -> list(binary()).
route_root_segments(Route_root) ->
    _pipe = Route_root,
    _pipe@1 = gleam@string:split(_pipe, <<"/"/utf8>>),
    gleam@list:filter(_pipe@1, fun(Segment) -> Segment /= <<""/utf8>> end).

-file("src/proute/generate/routes.gleam", 124).
-spec root_parser(proute@config:mount()) -> binary().
root_parser(Mount) ->
    case erlang:element(4, Mount) of
        <<"/"/utf8>> ->
            <<"  parse(uri.path_segments(without_fragment))\n"/utf8>>;

        _ ->
            Root_segments = begin
                _pipe = erlang:element(4, Mount),
                route_root_segments(_pipe)
            end,
            <<<<<<<<<<<<"  let segments = uri.path_segments(without_fragment)\n\n"/utf8,
                                    "  case segments {\n"/utf8>>/binary,
                                "    "/utf8>>/binary,
                            (segment_pattern(Root_segments))/binary>>/binary,
                        " -> parse(rest)\n"/utf8>>/binary,
                    "    _ -> NotFound\n"/utf8>>/binary,
                "  }\n"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 96).
-spec parse_comment(proute@config:mount(), list(proute@discover:page_route())) -> binary().
parse_comment(Mount, Routes) ->
    Base = [<<"The input may include a query string or fragment; both are ignored."/utf8>>],
    With_mount = case erlang:element(4, Mount) of
        <<"/"/utf8>> ->
            Base;

        _ ->
            lists:append(
                Base,
                [<<<<"The path must be rooted at `"/utf8,
                            (erlang:element(4, Mount))/binary>>/binary,
                        "`; paths outside that mount return `NotFound`."/utf8>>,
                    <<"This lets each"/utf8>>,
                    <<"mount own its own route tree without knowing about sibling mounts."/utf8>>]
            )
    end,
    Lines = case has_dynamic_routes(Routes) of
        true ->
            lists:append(
                With_mount,
                [<<"Dynamic path parameters are percent-decoded after path segmentation,"/utf8>>,
                    <<"so encoded slashes stay inside the parameter value. Invalid percent"/utf8>>,
                    <<"encoding in a dynamic segment returns `NotFound`."/utf8>>]
            );

        false ->
            With_mount
    end,
    proute@generate@text:doc_lines(Lines).

-file("src/proute/generate/routes.gleam", 76).
-spec parse_path(proute@config:mount(), list(proute@discover:page_route())) -> binary().
parse_path(Mount, Routes) ->
    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"/// Parse a request path into the "/utf8,
                                                                    (erlang:element(
                                                                        2,
                                                                        Mount
                                                                    ))/binary>>/binary,
                                                                " route tree.\n"/utf8>>/binary,
                                                            "///\n"/utf8>>/binary,
                                                        (parse_comment(
                                                            Mount,
                                                            Routes
                                                        ))/binary>>/binary,
                                                    "pub fn parse_path(raw: String) -> Route {\n"/utf8>>/binary,
                                                "  let without_query = case string.split(raw, \"?\") {\n"/utf8>>/binary,
                                            "    [path, ..] -> path\n"/utf8>>/binary,
                                        "    [] -> raw\n"/utf8>>/binary,
                                    "  }\n"/utf8>>/binary,
                                "  let without_fragment = case string.split(without_query, \"#\") {\n"/utf8>>/binary,
                            "    [path, ..] -> path\n"/utf8>>/binary,
                        "    [] -> without_query\n"/utf8>>/binary,
                    "  }\n"/utf8>>/binary,
                (root_parser(Mount))/binary>>/binary,
            "}\n\n"/utf8>>/binary,
        (parse_function(Routes))/binary>>.

-file("src/proute/generate/routes.gleam", 61).
-spec route_constructor(proute@discover:page_route()) -> binary().
route_constructor(Route) ->
    case erlang:element(6, Route) of
        [] ->
            erlang:element(3, Route);

        Params ->
            <<<<<<(erlang:element(3, Route))/binary, "("/utf8>>/binary,
                    (begin
                        _pipe = Params,
                        _pipe@1 = gleam@list:map(
                            _pipe,
                            fun(Param) ->
                                <<<<(erlang:element(2, Param))/binary,
                                        ": "/utf8>>/binary,
                                    (erlang:element(3, Param))/binary>>
                            end
                        ),
                        gleam@string:join(_pipe@1, <<", "/utf8>>)
                    end)/binary>>/binary,
                ")"/utf8>>
    end.

-file("src/proute/generate/routes.gleam", 530).
-spec title_name(binary()) -> binary().
title_name(Name) ->
    proute@names:pascal_case(Name).

-file("src/proute/generate/routes.gleam", 44).
-spec route_type(proute@config:mount(), list(proute@discover:page_route())) -> binary().
route_type(Mount, Routes) ->
    <<<<<<<<<<<<<<<<<<<<<<"/// "/utf8,
                                                (title_name(
                                                    erlang:element(2, Mount)
                                                ))/binary>>/binary,
                                            " routes generated from `"/utf8>>/binary,
                                        (erlang:element(3, Mount))/binary>>/binary,
                                    "`.\n"/utf8>>/binary,
                                "///\n"/utf8>>/binary,
                            "/// These constructors are the stable vocabulary callers use instead of\n"/utf8>>/binary,
                        "/// passing raw strings around. If a page file disappears, callers using\n"/utf8>>/binary,
                    "/// its constructor or helper should fail at compile time.\n"/utf8>>/binary,
                "pub type Route {\n"/utf8>>/binary,
            (proute@generate@text:indent_lines(
                begin
                    _pipe = Routes,
                    _pipe@1 = gleam@list:map(_pipe, fun route_constructor/1),
                    gleam@string:join(_pipe@1, <<"\n"/utf8>>)
                end
            ))/binary>>/binary,
        "\n}\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 40).
-spec imports() -> binary().
imports() ->
    <<<<"import gleam/bool\n"/utf8, "import gleam/string\n"/utf8>>/binary,
        "import gleam/uri\n"/utf8>>.

-file("src/proute/generate/routes.gleam", 26).
-spec header(proute@config:mount()) -> binary().
header(Mount) ->
    <<<<<<<<<<<<<<<<<<<<"//// Generated. 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>>.

-file("src/proute/generate/routes.gleam", 8).
-spec generate(proute@discover:mount_routes()) -> binary().
generate(Mount_routes) ->
    {mount_routes, Mount, Routes} = Mount_routes,
    _pipe = [header(Mount),
        imports(),
        route_type(Mount, Routes),
        parse_path(Mount, Routes),
        route_to_path(Mount, Routes),
        route_to_url(Mount),
        helpers(Mount, Routes),
        percent_decode(Routes),
        trim_trailing_slash()],
    _pipe@1 = gleam@list:filter(
        _pipe,
        fun(Section) -> Section /= <<""/utf8>> end
    ),
    gleam@string:join(_pipe@1, <<"\n"/utf8>>).