Current section
Files
Jump to
Current section
Files
src/router.erl
-module(router).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([new/0, add/4, get_handler/1]).
-export_type([router/0]).
-type router() :: {router,
gleam@dict:dict(route:route(), fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder())))}.
-spec new() -> router().
new() ->
{router, gleam@dict:new()}.
-spec add(
router(),
gleam@http:method(),
binary(),
fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder()))
) -> router().
add(Router, Method, Path, Handler) ->
_pipe = erlang:element(2, Router),
_pipe@1 = gleam@dict:insert(_pipe, route:new(Method, Path), Handler),
{router, _pipe@1}.
-spec not_found(gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder()).
not_found(Req) ->
_pipe = 404,
_pipe@1 = gleam@http@response:new(_pipe),
gleam@http@response:set_body(
_pipe@1,
gleam_stdlib:wrap_list(
<<<<<<"Cannot "/utf8,
(begin
_pipe@2 = erlang:element(2, Req),
_pipe@3 = gleam@http:method_to_string(_pipe@2),
gleam@string:uppercase(_pipe@3)
end)/binary>>/binary,
" "/utf8>>/binary,
(erlang:element(8, Req))/binary>>
)
).
-spec get_handler(router()) -> fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder())).
get_handler(Router) ->
fun(Req) ->
Route = route:new(erlang:element(2, Req), erlang:element(8, Req)),
case begin
_pipe = erlang:element(2, Router),
gleam@dict:get(_pipe, Route)
end of
{ok, Handler} ->
Handler(Req);
{error, _} ->
not_found(Req)
end
end.