-module(ewe@internal@handler). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/ewe/internal/handler.gleam"). -export([loop/2]). -export_type([exit_reason/0, next/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. ?MODULEDOC(false). -type exit_reason() :: normal | {abnormal, binary()}. -type next() :: continue | {stop, exit_reason()}. -file("src/ewe/internal/handler.gleam", 67). ?DOC(false). -spec handle_resp_body( gleam@http@request:request(ewe@internal@http:connection()), gleam@http@response:response(ewe@internal@http:response_body()), ewe@internal@http:response_body() ) -> next(). handle_resp_body(Req, Resp, Body) -> Http_version@1 = case erlang:element(5, erlang:element(4, Req)) of {some, Http_version} -> Http_version; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"ewe/internal/handler"/utf8>>, function => <<"handle_resp_body"/utf8>>, line => 72, value => _assert_fail, start => 1762, 'end' => 1822, pattern_start => 1773, pattern_end => 1798}) end, Bytes@1 = case Body of {text_data, Text} -> gleam_stdlib:wrap_list(Text); {string_tree_data, String_tree} -> gleam_stdlib:wrap_list(String_tree); {bits_data, Bits} -> gleam@bytes_tree:from_bit_array(Bits); {bytes_data, Bytes} -> Bytes; empty -> gleam@bytes_tree:new(); _ -> erlang:error(#{gleam_error => panic, message => <<"`panic` expression evaluated."/utf8>>, file => <>, module => <<"ewe/internal/handler"/utf8>>, function => <<"handle_resp_body"/utf8>>, line => 80}) end, Sent = begin _pipe = gleam@http@response:set_body(Resp, Bytes@1), _pipe@1 = ewe@internal@http:append_default_headers( _pipe, Http_version@1 ), _pipe@2 = ewe@internal@encoder:encode_response(_pipe@1), glisten@transport:send( erlang:element(2, erlang:element(4, Req)), erlang:element(3, erlang:element(4, Req)), _pipe@2 ) end, case Sent of {ok, nil} -> continue; {error, _} -> {stop, normal} end. -file("src/ewe/internal/handler.gleam", 48). ?DOC(false). -spec call_handler( gleam@http@request:request(ewe@internal@http:connection()), fun((gleam@http@request:request(ewe@internal@http:connection())) -> gleam@http@response:response(ewe@internal@http:response_body())), gleam@http@response:response(ewe@internal@http:response_body()) ) -> next(). call_handler(Req, Handler, On_crash) -> Resp = begin _pipe = ewe_ffi:rescue(fun() -> Handler(Req) end), _pipe@1 = gleam@result:map_error(_pipe, fun(_) -> On_crash end), gleam@result:unwrap_both(_pipe@1) end, case Resp of {response, _, _, {websocket_connection, Selector}} -> _ = gleam_erlang_ffi:select(Selector), {stop, normal}; {response, _, _, Body} -> handle_resp_body(Req, Resp, Body) end. -file("src/ewe/internal/handler.gleam", 28). ?DOC(false). -spec loop( fun((gleam@http@request:request(ewe@internal@http:connection())) -> gleam@http@response:response(ewe@internal@http:response_body())), gleam@http@response:response(ewe@internal@http:response_body()) ) -> fun((ewe@internal@http:connection(), glisten:message(KKC), glisten:connection(KKC)) -> glisten:next(ewe@internal@http:connection(), glisten:message(KKC))). loop(Handler, On_crash) -> fun(Http_conn, Msg, _) -> Msg@2 = case Msg of {packet, Msg@1} -> Msg@1; _assert_fail -> erlang:error(#{gleam_error => let_assert, message => <<"Pattern match failed, no pattern matched the value."/utf8>>, file => <>, module => <<"ewe/internal/handler"/utf8>>, function => <<"loop"/utf8>>, line => 33, value => _assert_fail, start => 722, 'end' => 758, pattern_start => 733, pattern_end => 752}) end, _pipe = ewe@internal@http:parse_request(Http_conn, Msg@2), _pipe@1 = gleam@result:map( _pipe, fun(Req) -> case call_handler(Req, Handler, On_crash) of continue -> glisten:continue(Http_conn); {stop, normal} -> glisten:stop(); {stop, {abnormal, Reason}} -> glisten:stop_abnormal(Reason) end end ), _pipe@2 = gleam@result:replace_error(_pipe@1, glisten:stop()), gleam@result:unwrap_both(_pipe@2) end.