-module(mist@encoder). -compile(no_auto_import). -export([to_bit_builder/1, response_builder/2, status_to_bit_string/1, encode_headers/1]). -spec to_bit_builder( gleam@http@response:response(gleam@bit_builder:bit_builder()) ) -> gleam@bit_builder:bit_builder(). to_bit_builder(Resp) -> Body_size = gleam@bit_builder:byte_size(erlang:element(4, Resp)), Headers = begin _pipe = gleam@map:from_list( [{<<"content-length"/utf8>>, gleam@int:to_string(Body_size)}, {<<"connection"/utf8>>, <<"keep-alive"/utf8>>}] ), gleam@list:fold( erlang:element(3, Resp), _pipe, fun(Defaults, Tup) -> {Key, Value} = Tup, gleam@map:insert(Defaults, Key, Value) end ) end, Body_builder = case Body_size of 0 -> gleam@bit_builder:new(); _@1 -> _pipe@1 = gleam@bit_builder:new(), _pipe@2 = gleam@bit_builder:append_builder( _pipe@1, erlang:element(4, Resp) ), gleam@bit_builder:append(_pipe@2, <<"\r\n"/utf8>>) end, _pipe@3 = erlang:element(2, Resp), _pipe@4 = response_builder(_pipe@3, gleam@map:to_list(Headers)), gleam@bit_builder:append_builder(_pipe@4, Body_builder). -spec response_builder(integer(), list({binary(), binary()})) -> gleam@bit_builder:bit_builder(). response_builder(Status, Headers) -> Status_string = begin _pipe = Status, _pipe@1 = gleam@int:to_string(_pipe), _pipe@2 = gleam@bit_builder:from_string(_pipe@1), _pipe@3 = gleam@bit_builder:append(_pipe@2, <<" "/utf8>>), gleam@bit_builder:append(_pipe@3, status_to_bit_string(Status)) end, _pipe@4 = gleam@bit_builder:new(), _pipe@5 = gleam@bit_builder:append(_pipe@4, <<"HTTP/1.1 "/utf8>>), _pipe@6 = gleam@bit_builder:append_builder(_pipe@5, Status_string), _pipe@7 = gleam@bit_builder:append(_pipe@6, <<"\r\n"/utf8>>), _pipe@8 = gleam@bit_builder:append_builder(_pipe@7, encode_headers(Headers)), gleam@bit_builder:append(_pipe@8, <<"\r\n"/utf8>>). -spec status_to_bit_string(integer()) -> bitstring(). status_to_bit_string(Status) -> case Status of 101 -> <<"Switching Protocols"/utf8>>; 200 -> <<"Ok"/utf8>>; 201 -> <<"Created"/utf8>>; 202 -> <<"Accepted"/utf8>>; 204 -> <<"No Content"/utf8>>; 301 -> <<"Moved Permanently"/utf8>>; 400 -> <<"Bad Request"/utf8>>; 401 -> <<"Unauthorized"/utf8>>; 403 -> <<"Forbidden"/utf8>>; 404 -> <<"Not Found"/utf8>>; 405 -> <<"Method Not Allowed"/utf8>>; 500 -> <<"Internal Server Error"/utf8>>; 502 -> <<"Bad Gateway"/utf8>>; 503 -> <<"Service Unavailable"/utf8>>; 504 -> <<"Gateway Timeout"/utf8>> end. -spec encode_headers(list({binary(), binary()})) -> gleam@bit_builder:bit_builder(). encode_headers(Headers) -> gleam@list:fold( Headers, gleam@bit_builder:new(), fun(Builder, Tup) -> {Header, Value} = Tup, _pipe = Builder, _pipe@1 = gleam@bit_builder:append_string(_pipe, Header), _pipe@2 = gleam@bit_builder:append(_pipe@1, <<": "/utf8>>), _pipe@3 = gleam@bit_builder:append_string(_pipe@2, Value), gleam@bit_builder:append(_pipe@3, <<"\r\n"/utf8>>) end ).