-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 -> <> 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( <> ) | 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, <<<>/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 [] -> <<< "/utf8>>/binary, (gleam@string:inspect(erlang:element(4, Route)))/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) -> <> 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>>).