aboutsummaryrefslogtreecommitdiff
path: root/aoc2023/build/packages/gleam_http/src/gleam@http@request.erl
diff options
context:
space:
mode:
Diffstat (limited to 'aoc2023/build/packages/gleam_http/src/gleam@http@request.erl')
-rw-r--r--aoc2023/build/packages/gleam_http/src/gleam@http@request.erl202
1 files changed, 202 insertions, 0 deletions
diff --git a/aoc2023/build/packages/gleam_http/src/gleam@http@request.erl b/aoc2023/build/packages/gleam_http/src/gleam@http@request.erl
new file mode 100644
index 0000000..630788d
--- /dev/null
+++ b/aoc2023/build/packages/gleam_http/src/gleam@http@request.erl
@@ -0,0 +1,202 @@
+-module(gleam@http@request).
+-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function]).
+
+-export([to_uri/1, from_uri/1, get_header/2, set_header/3, prepend_header/3, set_body/2, map/2, path_segments/1, get_query/1, set_query/2, set_method/2, new/0, to/1, set_scheme/2, set_host/2, set_port/2, set_path/2, set_cookie/3, get_cookies/1]).
+-export_type([request/1]).
+
+-type request(FYJ) :: {request,
+ gleam@http:method(),
+ list({binary(), binary()}),
+ FYJ,
+ gleam@http:scheme(),
+ binary(),
+ gleam@option:option(integer()),
+ binary(),
+ gleam@option:option(binary())}.
+
+-spec to_uri(request(any())) -> gleam@uri:uri().
+to_uri(Request) ->
+ {uri,
+ {some, gleam@http:scheme_to_string(erlang:element(5, Request))},
+ none,
+ {some, erlang:element(6, Request)},
+ erlang:element(7, Request),
+ erlang:element(8, Request),
+ erlang:element(9, Request),
+ none}.
+
+-spec from_uri(gleam@uri:uri()) -> {ok, request(binary())} | {error, nil}.
+from_uri(Uri) ->
+ gleam@result:then(
+ begin
+ _pipe = erlang:element(2, Uri),
+ _pipe@1 = gleam@option:unwrap(_pipe, <<""/utf8>>),
+ gleam@http:scheme_from_string(_pipe@1)
+ end,
+ fun(Scheme) ->
+ gleam@result:then(
+ begin
+ _pipe@2 = erlang:element(4, Uri),
+ gleam@option:to_result(_pipe@2, nil)
+ end,
+ fun(Host) ->
+ Req = {request,
+ get,
+ [],
+ <<""/utf8>>,
+ Scheme,
+ Host,
+ erlang:element(5, Uri),
+ erlang:element(6, Uri),
+ erlang:element(7, Uri)},
+ {ok, Req}
+ end
+ )
+ end
+ ).
+
+-spec get_header(request(any()), binary()) -> {ok, binary()} | {error, nil}.
+get_header(Request, Key) ->
+ gleam@list:key_find(erlang:element(3, Request), gleam@string:lowercase(Key)).
+
+-spec set_header(request(FYT), binary(), binary()) -> request(FYT).
+set_header(Request, Key, Value) ->
+ Headers = gleam@list:key_set(
+ erlang:element(3, Request),
+ gleam@string:lowercase(Key),
+ Value
+ ),
+ erlang:setelement(3, Request, Headers).
+
+-spec prepend_header(request(FYW), binary(), binary()) -> request(FYW).
+prepend_header(Request, Key, Value) ->
+ Headers = [{gleam@string:lowercase(Key), Value} |
+ erlang:element(3, Request)],
+ erlang:setelement(3, Request, Headers).
+
+-spec set_body(request(any()), FZB) -> request(FZB).
+set_body(Req, Body) ->
+ {request, Method, Headers, _, Scheme, Host, Port, Path, Query} = Req,
+ {request, Method, Headers, Body, Scheme, Host, Port, Path, Query}.
+
+-spec map(request(FZD), fun((FZD) -> FZF)) -> request(FZF).
+map(Request, Transform) ->
+ _pipe = erlang:element(4, Request),
+ _pipe@1 = Transform(_pipe),
+ set_body(Request, _pipe@1).
+
+-spec path_segments(request(any())) -> list(binary()).
+path_segments(Request) ->
+ _pipe = erlang:element(8, Request),
+ gleam@uri:path_segments(_pipe).
+
+-spec get_query(request(any())) -> {ok, list({binary(), binary()})} |
+ {error, nil}.
+get_query(Request) ->
+ case erlang:element(9, Request) of
+ {some, Query_string} ->
+ gleam@uri:parse_query(Query_string);
+
+ none ->
+ {ok, []}
+ end.
+
+-spec set_query(request(FZP), list({binary(), binary()})) -> request(FZP).
+set_query(Req, Query) ->
+ Pair = fun(T) ->
+ gleam@string_builder:from_strings(
+ [erlang:element(1, T), <<"="/utf8>>, erlang:element(2, T)]
+ )
+ end,
+ Query@1 = begin
+ _pipe = Query,
+ _pipe@1 = gleam@list:map(_pipe, Pair),
+ _pipe@2 = gleam@list:intersperse(
+ _pipe@1,
+ gleam@string_builder:from_string(<<"&"/utf8>>)
+ ),
+ _pipe@3 = gleam@string_builder:concat(_pipe@2),
+ _pipe@4 = gleam@string_builder:to_string(_pipe@3),
+ {some, _pipe@4}
+ end,
+ erlang:setelement(9, Req, Query@1).
+
+-spec set_method(request(FZT), gleam@http:method()) -> request(FZT).
+set_method(Req, Method) ->
+ erlang:setelement(2, Req, Method).
+
+-spec new() -> request(binary()).
+new() ->
+ {request,
+ get,
+ [],
+ <<""/utf8>>,
+ https,
+ <<"localhost"/utf8>>,
+ none,
+ <<""/utf8>>,
+ none}.
+
+-spec to(binary()) -> {ok, request(binary())} | {error, nil}.
+to(Url) ->
+ _pipe = Url,
+ _pipe@1 = gleam@uri:parse(_pipe),
+ gleam@result:then(_pipe@1, fun from_uri/1).
+
+-spec set_scheme(request(GAA), gleam@http:scheme()) -> request(GAA).
+set_scheme(Req, Scheme) ->
+ erlang:setelement(5, Req, Scheme).
+
+-spec set_host(request(GAD), binary()) -> request(GAD).
+set_host(Req, Host) ->
+ erlang:setelement(6, Req, Host).
+
+-spec set_port(request(GAG), integer()) -> request(GAG).
+set_port(Req, Port) ->
+ erlang:setelement(7, Req, {some, Port}).
+
+-spec set_path(request(GAJ), binary()) -> request(GAJ).
+set_path(Req, Path) ->
+ erlang:setelement(8, Req, Path).
+
+-spec set_cookie(request(GAM), binary(), binary()) -> request(GAM).
+set_cookie(Req, Name, Value) ->
+ New_cookie_string = gleam@string:join([Name, Value], <<"="/utf8>>),
+ {Cookies_string@2, Headers@1} = case gleam@list:key_pop(
+ erlang:element(3, Req),
+ <<"cookie"/utf8>>
+ ) of
+ {ok, {Cookies_string, Headers}} ->
+ Cookies_string@1 = gleam@string:join(
+ [Cookies_string, New_cookie_string],
+ <<"; "/utf8>>
+ ),
+ {Cookies_string@1, Headers};
+
+ {error, nil} ->
+ {New_cookie_string, erlang:element(3, Req)}
+ end,
+ erlang:setelement(
+ 3,
+ Req,
+ [{<<"cookie"/utf8>>, Cookies_string@2} | Headers@1]
+ ).
+
+-spec get_cookies(request(any())) -> list({binary(), binary()}).
+get_cookies(Req) ->
+ {request, _, Headers, _, _, _, _, _, _} = Req,
+ _pipe = Headers,
+ _pipe@1 = gleam@list:filter_map(
+ _pipe,
+ fun(Header) ->
+ {Name, Value} = Header,
+ case Name of
+ <<"cookie"/utf8>> ->
+ {ok, gleam@http@cookie:parse(Value)};
+
+ _ ->
+ {error, nil}
+ end
+ end
+ ),
+ gleam@list:flatten(_pipe@1).