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