-module(docs@log_requests). -compile([no_auto_import, nowarn_unused_vars]). -export([middleware/1]). -export_type([time_unit/0]). -type time_unit() :: native | microsecond. -spec format_log_line( gleam@http@request:request(any()), gleam@http@response:response(any()), integer() ) -> binary(). format_log_line(Request, Response, Elapsed) -> Elapsed@1 = case Elapsed > 1000 of true -> gleam@string:append( gleam@int:to_string(Elapsed div 1000), <<"ms"/utf8>> ); false -> gleam@string:append(gleam@int:to_string(Elapsed), <<"µs"/utf8>>) end, gleam@string:concat( [begin _pipe = erlang:element(2, Request), _pipe@1 = gleam@http:method_to_string(_pipe), gleam@string:uppercase(_pipe@1) end, <<" "/utf8>>, erlang:element(8, Request), <<" "/utf8>>, gleam@int:to_string(erlang:element(2, Response)), <<" sent in "/utf8>>, Elapsed@1] ). -spec middleware( fun((gleam@http@request:request(NPN)) -> gleam@http@response:response(NPO)) ) -> fun((gleam@http@request:request(NPN)) -> gleam@http@response:response(NPO)). middleware(Service) -> fun(Request) -> Before = erlang:monotonic_time(), Response = Service(Request), Elapsed = erlang:convert_time_unit( erlang:monotonic_time() - Before, native, microsecond ), docs@utils@logger:info(format_log_line(Request, Response, Elapsed)), Response end.