-module(lightspeed@framework@http). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/lightspeed/framework/http.gleam"). -export([request/9, from_request/1, request_path/1, request_method/1, request_body/1, request_session_id/1, request_csrf_token/1, request_origin/1, request_header/2, set_status/2, set_body/2, put_header/3, send/4, halt/1, halted/1, put_session/3, drop_session/2, session/2, session_all/1, put_flash/3, flash/2, clear_flash/1, flash_all/1, with_route_params/2, route_param/2, route_params/1, to_response/1, response_status/1, response_headers/1, response_body/1, response_session/1, response_flash/1, method_label/1, response_label/1]). -export_type([method/0, request/0, route_param/0, response/0, conn/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(" Core HTTP connection model for framework-compatible endpoint flows.\n"). -type method() :: get | post | put | patch | delete | head | options | {other, binary()}. -type request() :: {request, method(), binary(), list({binary(), binary()}), binary(), binary(), binary(), binary(), list({binary(), binary()}), list({binary(), binary()})}. -type route_param() :: {route_param, binary(), binary()}. -type response() :: {response, integer(), list({binary(), binary()}), binary(), list({binary(), binary()}), list({binary(), binary()})}. -type conn() :: {conn, request(), response(), boolean(), list(route_param())}. -file("src/lightspeed/framework/http.gleam", 61). ?DOC(" Build a request.\n"). -spec request( method(), binary(), list({binary(), binary()}), binary(), binary(), binary(), binary(), list({binary(), binary()}), list({binary(), binary()}) ) -> request(). request( Method, Path, Headers, Body, Session_id, Csrf_token, Origin, Session, Flash ) -> {request, Method, Path, Headers, Body, Session_id, Csrf_token, Origin, Session, Flash}. -file("src/lightspeed/framework/http.gleam", 86). ?DOC(" Create a new connection from one request.\n"). -spec from_request(request()) -> conn(). from_request(Request) -> {conn, Request, {response, 200, [], <<""/utf8>>, erlang:element(9, Request), erlang:element(10, Request)}, false, []}. -file("src/lightspeed/framework/http.gleam", 102). ?DOC(" Request path.\n"). -spec request_path(conn()) -> binary(). request_path(Conn) -> erlang:element(3, erlang:element(2, Conn)). -file("src/lightspeed/framework/http.gleam", 107). ?DOC(" Request method.\n"). -spec request_method(conn()) -> method(). request_method(Conn) -> erlang:element(2, erlang:element(2, Conn)). -file("src/lightspeed/framework/http.gleam", 112). ?DOC(" Request body.\n"). -spec request_body(conn()) -> binary(). request_body(Conn) -> erlang:element(5, erlang:element(2, Conn)). -file("src/lightspeed/framework/http.gleam", 117). ?DOC(" Request session id.\n"). -spec request_session_id(conn()) -> binary(). request_session_id(Conn) -> erlang:element(6, erlang:element(2, Conn)). -file("src/lightspeed/framework/http.gleam", 122). ?DOC(" Request CSRF token.\n"). -spec request_csrf_token(conn()) -> binary(). request_csrf_token(Conn) -> erlang:element(7, erlang:element(2, Conn)). -file("src/lightspeed/framework/http.gleam", 127). ?DOC(" Request origin.\n"). -spec request_origin(conn()) -> binary(). request_origin(Conn) -> erlang:element(8, erlang:element(2, Conn)). -file("src/lightspeed/framework/http.gleam", 296). -spec normalize_header(binary()) -> binary(). normalize_header(Key) -> string:lowercase(Key). -file("src/lightspeed/framework/http.gleam", 300). -spec find_header(list({binary(), binary()}), binary()) -> gleam@option:option(binary()). find_header(Headers, Key) -> case Headers of [] -> none; [{Entry_key, Value} | Rest] -> case normalize_header(Entry_key) =:= Key of true -> {some, Value}; false -> find_header(Rest, Key) end end. -file("src/lightspeed/framework/http.gleam", 132). ?DOC(" Request header by key.\n"). -spec request_header(conn(), binary()) -> gleam@option:option(binary()). request_header(Conn, Key) -> find_header( erlang:element(4, erlang:element(2, Conn)), normalize_header(Key) ). -file("src/lightspeed/framework/http.gleam", 137). ?DOC(" Set one response status.\n"). -spec set_status(conn(), integer()) -> conn(). set_status(Conn, Status) -> Response = erlang:element(3, Conn), {conn, erlang:element(2, Conn), {response, Status, erlang:element(3, Response), erlang:element(4, Response), erlang:element(5, Response), erlang:element(6, Response)}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 143). ?DOC(" Set one response body.\n"). -spec set_body(conn(), binary()) -> conn(). set_body(Conn, Body) -> Response = erlang:element(3, Conn), {conn, erlang:element(2, Conn), {response, erlang:element(2, Response), erlang:element(3, Response), Body, erlang:element(5, Response), erlang:element(6, Response)}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 314). -spec upsert_header(list({binary(), binary()}), binary(), binary()) -> list({binary(), binary()}). upsert_header(Headers, Key, Value) -> case Headers of [] -> [{Key, Value}]; [{Entry_key, Entry_value} | Rest] -> case normalize_header(Entry_key) =:= Key of true -> [{Key, Value} | Rest]; false -> [{Entry_key, Entry_value} | upsert_header(Rest, Key, Value)] end end. -file("src/lightspeed/framework/http.gleam", 149). ?DOC(" Set or replace one response header.\n"). -spec put_header(conn(), binary(), binary()) -> conn(). put_header(Conn, Key, Value) -> Response = erlang:element(3, Conn), Normalized_key = normalize_header(Key), Updated_headers = upsert_header( erlang:element(3, Response), Normalized_key, Value ), {conn, erlang:element(2, Conn), {response, erlang:element(2, Response), Updated_headers, erlang:element(4, Response), erlang:element(5, Response), erlang:element(6, Response)}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 158). ?DOC(" Write a full response tuple.\n"). -spec send(conn(), integer(), binary(), binary()) -> conn(). send(Conn, Status, Content_type, Body) -> _pipe = Conn, _pipe@1 = set_status(_pipe, Status), _pipe@2 = put_header(_pipe@1, <<"content-type"/utf8>>, Content_type), set_body(_pipe@2, Body). -file("src/lightspeed/framework/http.gleam", 171). ?DOC(" Halt further endpoint processing.\n"). -spec halt(conn()) -> conn(). halt(Conn) -> {conn, erlang:element(2, Conn), erlang:element(3, Conn), true, erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 176). ?DOC(" True when the connection has been halted.\n"). -spec halted(conn()) -> boolean(). halted(Conn) -> erlang:element(4, Conn). -file("src/lightspeed/framework/http.gleam", 340). -spec upsert_pair(list({binary(), binary()}), binary(), binary()) -> list({binary(), binary()}). upsert_pair(Entries, Key, Value) -> case Entries of [] -> [{Key, Value}]; [{Entry_key, Entry_value} | Rest] -> case Entry_key =:= Key of true -> [{Key, Value} | Rest]; false -> [{Entry_key, Entry_value} | upsert_pair(Rest, Key, Value)] end end. -file("src/lightspeed/framework/http.gleam", 181). ?DOC(" Update session entry in response state.\n"). -spec put_session(conn(), binary(), binary()) -> conn(). put_session(Conn, Key, Value) -> Response = erlang:element(3, Conn), Session = upsert_pair(erlang:element(5, Response), Key, Value), {conn, erlang:element(2, Conn), {response, erlang:element(2, Response), erlang:element(3, Response), erlang:element(4, Response), Session, erlang:element(6, Response)}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 355). -spec remove_pair(list({binary(), binary()}), binary()) -> list({binary(), binary()}). remove_pair(Entries, Key) -> case Entries of [] -> []; [{Entry_key, Entry_value} | Rest] -> case Entry_key =:= Key of true -> remove_pair(Rest, Key); false -> [{Entry_key, Entry_value} | remove_pair(Rest, Key)] end end. -file("src/lightspeed/framework/http.gleam", 188). ?DOC(" Delete session entry in response state.\n"). -spec drop_session(conn(), binary()) -> conn(). drop_session(Conn, Key) -> Response = erlang:element(3, Conn), Session = remove_pair(erlang:element(5, Response), Key), {conn, erlang:element(2, Conn), {response, erlang:element(2, Response), erlang:element(3, Response), erlang:element(4, Response), Session, erlang:element(6, Response)}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 329). -spec find_pair(list({binary(), binary()}), binary()) -> gleam@option:option(binary()). find_pair(Entries, Key) -> case Entries of [] -> none; [{Entry_key, Value} | Rest] -> case Entry_key =:= Key of true -> {some, Value}; false -> find_pair(Rest, Key) end end. -file("src/lightspeed/framework/http.gleam", 195). ?DOC(" Read session entry from response state.\n"). -spec session(conn(), binary()) -> gleam@option:option(binary()). session(Conn, Key) -> find_pair(erlang:element(5, erlang:element(3, Conn)), Key). -file("src/lightspeed/framework/http.gleam", 200). ?DOC(" Full response-session state.\n"). -spec session_all(conn()) -> list({binary(), binary()}). session_all(Conn) -> erlang:element(5, erlang:element(3, Conn)). -file("src/lightspeed/framework/http.gleam", 205). ?DOC(" Update flash entry in response state.\n"). -spec put_flash(conn(), binary(), binary()) -> conn(). put_flash(Conn, Key, Value) -> Response = erlang:element(3, Conn), Flash = upsert_pair(erlang:element(6, Response), Key, Value), {conn, erlang:element(2, Conn), {response, erlang:element(2, Response), erlang:element(3, Response), erlang:element(4, Response), erlang:element(5, Response), Flash}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 212). ?DOC(" Read flash entry from response state.\n"). -spec flash(conn(), binary()) -> gleam@option:option(binary()). flash(Conn, Key) -> find_pair(erlang:element(6, erlang:element(3, Conn)), Key). -file("src/lightspeed/framework/http.gleam", 217). ?DOC(" Clear all flash entries.\n"). -spec clear_flash(conn()) -> conn(). clear_flash(Conn) -> Response = erlang:element(3, Conn), {conn, erlang:element(2, Conn), {response, erlang:element(2, Response), erlang:element(3, Response), erlang:element(4, Response), erlang:element(5, Response), []}, erlang:element(4, Conn), erlang:element(5, Conn)}. -file("src/lightspeed/framework/http.gleam", 223). ?DOC(" Full response-flash state.\n"). -spec flash_all(conn()) -> list({binary(), binary()}). flash_all(Conn) -> erlang:element(6, erlang:element(3, Conn)). -file("src/lightspeed/framework/http.gleam", 228). ?DOC(" Set route params on the connection.\n"). -spec with_route_params(conn(), list(route_param())) -> conn(). with_route_params(Conn, Params) -> {conn, erlang:element(2, Conn), erlang:element(3, Conn), erlang:element(4, Conn), Params}. -file("src/lightspeed/framework/http.gleam", 369). -spec find_param(list(route_param()), binary()) -> gleam@option:option(binary()). find_param(Params, Key) -> case Params of [] -> none; [{route_param, Name, Value} | Rest] -> case Name =:= Key of true -> {some, Value}; false -> find_param(Rest, Key) end end. -file("src/lightspeed/framework/http.gleam", 233). ?DOC(" Route param value by key.\n"). -spec route_param(conn(), binary()) -> gleam@option:option(binary()). route_param(Conn, Key) -> find_param(erlang:element(5, Conn), Key). -file("src/lightspeed/framework/http.gleam", 238). ?DOC(" All route params.\n"). -spec route_params(conn()) -> list(route_param()). route_params(Conn) -> erlang:element(5, Conn). -file("src/lightspeed/framework/http.gleam", 243). ?DOC(" Final response.\n"). -spec to_response(conn()) -> response(). to_response(Conn) -> erlang:element(3, Conn). -file("src/lightspeed/framework/http.gleam", 248). ?DOC(" Response status code.\n"). -spec response_status(response()) -> integer(). response_status(Response) -> erlang:element(2, Response). -file("src/lightspeed/framework/http.gleam", 253). ?DOC(" Response headers.\n"). -spec response_headers(response()) -> list({binary(), binary()}). response_headers(Response) -> erlang:element(3, Response). -file("src/lightspeed/framework/http.gleam", 258). ?DOC(" Response body.\n"). -spec response_body(response()) -> binary(). response_body(Response) -> erlang:element(4, Response). -file("src/lightspeed/framework/http.gleam", 263). ?DOC(" Response session state.\n"). -spec response_session(response()) -> list({binary(), binary()}). response_session(Response) -> erlang:element(5, Response). -file("src/lightspeed/framework/http.gleam", 268). ?DOC(" Response flash state.\n"). -spec response_flash(response()) -> list({binary(), binary()}). response_flash(Response) -> erlang:element(6, Response). -file("src/lightspeed/framework/http.gleam", 273). ?DOC(" Stable method label.\n"). -spec method_label(method()) -> binary(). method_label(Method) -> case Method of get -> <<"GET"/utf8>>; post -> <<"POST"/utf8>>; put -> <<"PUT"/utf8>>; patch -> <<"PATCH"/utf8>>; delete -> <<"DELETE"/utf8>>; head -> <<"HEAD"/utf8>>; options -> <<"OPTIONS"/utf8>>; {other, Label} -> Label end. -file("src/lightspeed/framework/http.gleam", 380). -spec content_type_label(list({binary(), binary()})) -> binary(). content_type_label(Headers) -> case find_header(Headers, <<"content-type"/utf8>>) of {some, Value} -> Value; none -> <<"unset"/utf8>> end. -file("src/lightspeed/framework/http.gleam", 287). ?DOC(" Stable response label for fixture assertions.\n"). -spec response_label(response()) -> binary(). response_label(Response) -> <<<<<<<<<<"status="/utf8, (erlang:integer_to_binary(erlang:element(2, Response)))/binary>>/binary, ",content_type="/utf8>>/binary, (content_type_label(erlang:element(3, Response)))/binary>>/binary, ",body_bytes="/utf8>>/binary, (erlang:integer_to_binary(string:length(erlang:element(4, Response))))/binary>>.