Current section
Files
Jump to
Current section
Files
src/tinyroute@router.erl
-module(tinyroute@router).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([add/4, set_not_found_handler/2, new/0, set_log/2, get_handler/1]).
-export_type([router/0]).
-type router() :: {router,
gleam@dict:dict(tinyroute@route:route(), fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder()))),
fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder())),
boolean()}.
-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,
tinyroute@route:new(Method, Path),
Handler
),
{router, _pipe@1, erlang:element(3, Router), erlang:element(4, Router)}.
-spec set_not_found_handler(
router(),
fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder()))
) -> router().
set_not_found_handler(Router, Not_found_handler) ->
{router,
erlang:element(2, Router),
Not_found_handler,
erlang:element(4, Router)}.
-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 new() -> router().
new() ->
{router, gleam@dict:new(), fun not_found/1, true}.
-spec set_log(router(), boolean()) -> router().
set_log(Router, Value) ->
{router, erlang:element(2, Router), erlang:element(3, Router), Value}.
-spec log(
boolean(),
gleam@http@request:request(bitstring()),
gleam@http@response:response(gleam@bytes_builder:bytes_builder())
) -> gleam@http@response:response(gleam@bytes_builder:bytes_builder()).
log(Log, Req, Response) ->
case Log of
true ->
Method = begin
_pipe = erlang:element(2, Req),
_pipe@1 = gleam@http:method_to_string(_pipe),
gleam@string:uppercase(_pipe@1)
end,
Query@1 = case erlang:element(9, Req) of
{some, Query} ->
Query;
none ->
<<""/utf8>>
end,
gleam@io:println(
<<<<<<<<<<Method/binary, " "/utf8>>/binary,
(erlang:element(8, Req))/binary>>/binary,
Query@1/binary>>/binary,
" "/utf8>>/binary,
(begin
_pipe@2 = erlang:element(2, Response),
gleam@int:to_string(_pipe@2)
end)/binary>>
),
Response;
_ ->
Response
end.
-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 = tinyroute@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} ->
log(erlang:element(4, Router), Req, Handler(Req));
{error, _} ->
log(
erlang:element(4, Router),
Req,
(erlang:element(3, Router))(Req)
)
end
end.