Skip to main content

src/http_server_mock@response.erl

-module(http_server_mock@response).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/http_server_mock/response.gleam").
-export([new/0, status/2, header/3, body/2, json_body/2, delay/2, ok/0, not_found/0, server_error/0, created/0, accepted/0, no_content/0, bad_request/0, unauthorized/0, forbidden/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(
    " Builder for `ResponseDefinition` — what the server sends back when a stub\n"
    " matches an incoming request.\n"
    "\n"
    " Start with `new()` (or one of the shorthand constructors) and pipe through\n"
    " the functions you need.\n"
    "\n"
    " ```gleam\n"
    " let resp =\n"
    "   response.new()\n"
    "   |> response.status(201)\n"
    "   |> response.header(\"x-request-id\", \"abc123\")\n"
    "   |> response.json_body(\"{\\\"id\\\":1,\\\"status\\\":\\\"created\\\"}\")\n"
    " ```\n"
).

-file("src/http_server_mock/response.gleam", 21).
?DOC(" Returns a new `ResponseDefinition` with status 200, no headers, and no body.\n").
-spec new() -> http_server_mock@types:response_definition().
new() ->
    {response_definition, 200, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 26).
?DOC(" Sets the HTTP status code for the response.\n").
-spec status(http_server_mock@types:response_definition(), integer()) -> http_server_mock@types:response_definition().
status(Response_def, Code) ->
    {response_definition,
        Code,
        erlang:element(3, Response_def),
        erlang:element(4, Response_def),
        erlang:element(5, Response_def)}.

-file("src/http_server_mock/response.gleam", 34).
?DOC(" Adds a response header. Can be called multiple times to add several headers.\n").
-spec header(http_server_mock@types:response_definition(), binary(), binary()) -> http_server_mock@types:response_definition().
header(Response_def, Key, Value) ->
    {response_definition,
        erlang:element(2, Response_def),
        [{Key, Value} | erlang:element(3, Response_def)],
        erlang:element(4, Response_def),
        erlang:element(5, Response_def)}.

-file("src/http_server_mock/response.gleam", 46).
?DOC(" Sets the response body to a plain text string.\n").
-spec body(http_server_mock@types:response_definition(), binary()) -> http_server_mock@types:response_definition().
body(Response_def, Text) ->
    {response_definition,
        erlang:element(2, Response_def),
        erlang:element(3, Response_def),
        {string_body, Text},
        erlang:element(5, Response_def)}.

-file("src/http_server_mock/response.gleam", 55).
?DOC(
    " Sets the response body to a JSON string and automatically adds a\n"
    " `content-type: application/json` header.\n"
).
-spec json_body(http_server_mock@types:response_definition(), binary()) -> http_server_mock@types:response_definition().
json_body(Response_def, Json) ->
    With_content_type = {response_definition,
        erlang:element(2, Response_def),
        [{<<"content-type"/utf8>>, <<"application/json"/utf8>>} |
            erlang:element(3, Response_def)],
        erlang:element(4, Response_def),
        erlang:element(5, Response_def)},
    {response_definition,
        erlang:element(2, With_content_type),
        erlang:element(3, With_content_type),
        {raw_json_body, Json},
        erlang:element(5, With_content_type)}.

-file("src/http_server_mock/response.gleam", 70).
?DOC(
    " Delays the response by `milliseconds` before sending it.\n"
    "\n"
    " Useful for testing timeout handling or slow-network behaviour.\n"
).
-spec delay(http_server_mock@types:response_definition(), integer()) -> http_server_mock@types:response_definition().
delay(Response_def, Milliseconds) ->
    {response_definition,
        erlang:element(2, Response_def),
        erlang:element(3, Response_def),
        erlang:element(4, Response_def),
        {some, Milliseconds}}.

-file("src/http_server_mock/response.gleam", 78).
?DOC(" Returns a `ResponseDefinition` for HTTP 200 OK with no body.\n").
-spec ok() -> http_server_mock@types:response_definition().
ok() ->
    {response_definition, 200, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 83).
?DOC(" Returns a `ResponseDefinition` for HTTP 404 Not Found with no body.\n").
-spec not_found() -> http_server_mock@types:response_definition().
not_found() ->
    {response_definition, 404, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 88).
?DOC(" Returns a `ResponseDefinition` for HTTP 500 Internal Server Error with no body.\n").
-spec server_error() -> http_server_mock@types:response_definition().
server_error() ->
    {response_definition, 500, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 93).
?DOC(" Returns a `ResponseDefinition` for HTTP 201 Created with no body.\n").
-spec created() -> http_server_mock@types:response_definition().
created() ->
    {response_definition, 201, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 98).
?DOC(" Returns a `ResponseDefinition` for HTTP 202 Accepted with no body.\n").
-spec accepted() -> http_server_mock@types:response_definition().
accepted() ->
    {response_definition, 202, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 103).
?DOC(" Returns a `ResponseDefinition` for HTTP 204 No Content with no body.\n").
-spec no_content() -> http_server_mock@types:response_definition().
no_content() ->
    {response_definition, 204, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 108).
?DOC(" Returns a `ResponseDefinition` for HTTP 400 Bad Request with no body.\n").
-spec bad_request() -> http_server_mock@types:response_definition().
bad_request() ->
    {response_definition, 400, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 113).
?DOC(" Returns a `ResponseDefinition` for HTTP 401 Unauthorized with no body.\n").
-spec unauthorized() -> http_server_mock@types:response_definition().
unauthorized() ->
    {response_definition, 401, [], no_body, none}.

-file("src/http_server_mock/response.gleam", 118).
?DOC(" Returns a `ResponseDefinition` for HTTP 403 Forbidden with no body.\n").
-spec forbidden() -> http_server_mock@types:response_definition().
forbidden() ->
    {response_definition, 403, [], no_body, none}.