-module(ewe). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/ewe.gleam"). -export([ip_address_to_string/1, new/1, port/2, bind/2, bind_all/1, ipv6/1, start/1, supervised/1, read_body/1]). -export_type([ip_address/0, builder/0]). -type ip_address() :: {ip_v4, integer(), integer(), integer(), integer()} | {ip_v6, integer(), integer(), integer(), integer(), integer(), integer(), integer(), integer()}. -opaque builder() :: {builder, fun((gleam@http@request:request(ewe@internal@http:connection())) -> gleam@http@response:response(gleam@bytes_tree:bytes_tree())), integer(), binary(), boolean(), fun((gleam@http:scheme(), ip_address(), integer()) -> nil)}. -file("src/ewe.gleam", 31). -spec convert_to_ewe_ip(glisten:ip_address()) -> ip_address(). convert_to_ewe_ip(Ip) -> case Ip of {ip_v4, N1, N2, N3, N4} -> {ip_v4, N1, N2, N3, N4}; {ip_v6, N1@1, N2@1, N3@1, N4@1, N5, N6, N7, N8} -> {ip_v6, N1@1, N2@1, N3@1, N4@1, N5, N6, N7, N8} end. -file("src/ewe.gleam", 39). -spec convert_to_glisten_ip(ip_address()) -> glisten:ip_address(). convert_to_glisten_ip(Ip) -> case Ip of {ip_v4, N1, N2, N3, N4} -> {ip_v4, N1, N2, N3, N4}; {ip_v6, N1@1, N2@1, N3@1, N4@1, N5, N6, N7, N8} -> {ip_v6, N1@1, N2@1, N3@1, N4@1, N5, N6, N7, N8} end. -file("src/ewe.gleam", 26). -spec ip_address_to_string(ip_address()) -> binary(). ip_address_to_string(Address) -> _pipe = convert_to_glisten_ip(Address), glisten:ip_address_to_string(_pipe). -file("src/ewe.gleam", 58). -spec new( fun((gleam@http@request:request(ewe@internal@http:connection())) -> gleam@http@response:response(gleam@bytes_tree:bytes_tree())) ) -> builder(). new(Handler) -> {builder, Handler, 8080, <<"127.0.0.1"/utf8>>, false, fun(Scheme, Ip_address, Port) -> Address = case Ip_address of {ip_v6, _, _, _, _, _, _, _, _} -> <<<<"["/utf8, (ip_address_to_string(Ip_address))/binary>>/binary, "]"/utf8>>; {ip_v4, _, _, _, _} -> ip_address_to_string(Ip_address) end, Url = <<<<<<<<(gleam@http:scheme_to_string(Scheme))/binary, "://"/utf8>>/binary, Address/binary>>/binary, ":"/utf8>>/binary, (erlang:integer_to_binary(Port))/binary>>, gleam_stdlib:println(<<"Listening on "/utf8, Url/binary>>) end}. -file("src/ewe.gleam", 82). -spec port(builder(), integer()) -> builder(). port(Builder, Port) -> {builder, erlang:element(2, Builder), Port, erlang:element(4, Builder), erlang:element(5, Builder), erlang:element(6, Builder)}. -file("src/ewe.gleam", 86). -spec bind(builder(), binary()) -> builder(). bind(Builder, Interface) -> {builder, erlang:element(2, Builder), erlang:element(3, Builder), Interface, erlang:element(5, Builder), erlang:element(6, Builder)}. -file("src/ewe.gleam", 90). -spec bind_all(builder()) -> builder(). bind_all(Builder) -> {builder, erlang:element(2, Builder), erlang:element(3, Builder), <<"0.0.0.0"/utf8>>, erlang:element(5, Builder), erlang:element(6, Builder)}. -file("src/ewe.gleam", 94). -spec ipv6(builder()) -> builder(). ipv6(Builder) -> {builder, erlang:element(2, Builder), erlang:element(3, Builder), erlang:element(4, Builder), true, erlang:element(6, Builder)}. -file("src/ewe.gleam", 98). -spec start(builder()) -> {ok, gleam@otp@actor:started(gleam@otp@static_supervisor:supervisor())} | {error, gleam@otp@actor:start_error()}. start(Builder) -> Name = gleam_erlang_ffi:new_name(<<"ewe_glisten"/utf8>>), _pipe@2 = glisten:new( fun(Conn) -> {ewe@internal@http:transform_connection(Conn), none} end, fun(Http_conn, Msg, Conn@1) -> 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"/utf8>>, function => <<"start"/utf8>>, line => 106, value => _assert_fail, start => 2491, 'end' => 2527, pattern_start => 2502, pattern_end => 2521}) end, case ewe@internal@http:parse_request(Http_conn, Msg@2) of {ok, {parsed_request, Request, Version}} -> Resp = begin _pipe = (erlang:element(2, Builder))(Request), _pipe@1 = ewe@internal@response:append_default_headers( _pipe, Version ), ewe@internal@response:encode(_pipe@1) end, case glisten@transport:send( erlang:element(3, Conn@1), erlang:element(2, Conn@1), Resp ) of {ok, nil} -> glisten:continue(Http_conn); {error, _} -> glisten:stop() end; {error, _} -> glisten:stop() end end ), _pipe@3 = glisten:bind(_pipe@2, erlang:element(4, Builder)), _pipe@4 = (fun(Glisten_builder) -> case erlang:element(5, Builder) of true -> glisten:with_ipv6(Glisten_builder); false -> Glisten_builder end end)(_pipe@3), _pipe@5 = glisten:start_with_listener_name( _pipe@4, erlang:element(3, Builder), Name ), gleam@result:map( _pipe@5, fun(Started) -> Server_info = glisten:get_server_info(Name, 10000), Scheme = http, Ip_address = convert_to_ewe_ip(erlang:element(3, Server_info)), (erlang:element(6, Builder))( Scheme, Ip_address, erlang:element(2, Server_info) ), Started end ). -file("src/ewe.gleam", 144). -spec supervised(builder()) -> gleam@otp@supervision:child_specification(gleam@otp@static_supervisor:supervisor()). supervised(Builder) -> gleam@otp@supervision:supervisor(fun() -> start(Builder) end). -file("src/ewe.gleam", 150). -spec read_body(gleam@http@request:request(ewe@internal@http:connection())) -> {ok, gleam@http@request:request(bitstring())} | {error, nil}. read_body(Req) -> _pipe = ewe@internal@http:read_body(Req), gleam@result:replace_error(_pipe, nil).