Current section
Files
Jump to
Current section
Files
src/bliss.erl
-module(bliss).
-compile(no_auto_import).
-export([use_handler/1, if_methods/1, if_get/1, if_post/1, if_delete/1, not_found/2, unmatched/2, json_response/1, service/2]).
-export_type([response_error/0]).
-type response_error() :: unmatched | not_found | unauthorised.
-spec use_handler(
fun((gleam@http@request:request(bitstring()), FDA) -> fun((gleam@http@request:request(bitstring()), FDA) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}))
) -> fun((gleam@http@request:request(bitstring()), FDA) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}).
use_handler(Provide) ->
fun(Req, Ctx) ->
Handler = Provide(Req, Ctx),
Handler(Req, Ctx)
end.
-spec is_wanted_method(
gleam@http:method(),
gleam@http@request:request(bitstring())
) -> boolean().
is_wanted_method(Wanted_method, Req) ->
case Wanted_method of
{other, <<"*"/utf8>>} ->
true;
_@1 ->
erlang:element(2, Req) =:= Wanted_method
end.
-spec has_wanted_method(
list(gleam@http:method()),
gleam@http@request:request(bitstring())
) -> boolean().
has_wanted_method(Wanted_methods, Req) ->
gleam@list:any(
Wanted_methods,
fun(_capture) -> is_wanted_method(_capture, Req) end
).
-spec if_methods(list(gleam@http:method())) -> fun((fun((gleam@http@request:request(bitstring()), FDH) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()})) -> fun((gleam@http@request:request(bitstring()), FDH) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()})).
if_methods(Wanted_methods) ->
fun(Handler) ->
fun(Req, Ctx) ->
Has_wanted = has_wanted_method(Wanted_methods, Req),
case Has_wanted of
true ->
Handler(Req, Ctx);
false ->
{error, unmatched}
end
end
end.
-spec if_get(
fun((gleam@http@request:request(bitstring()), FDK) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()})
) -> fun((gleam@http@request:request(bitstring()), FDK) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}).
if_get(Handler) ->
(if_methods([get]))(Handler).
-spec if_post(
fun((gleam@http@request:request(bitstring()), FDN) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()})
) -> fun((gleam@http@request:request(bitstring()), FDN) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}).
if_post(Handler) ->
(if_methods([post]))(Handler).
-spec if_delete(
fun((gleam@http@request:request(bitstring()), FDQ) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()})
) -> fun((gleam@http@request:request(bitstring()), FDQ) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}).
if_delete(Handler) ->
(if_methods([delete]))(Handler).
-spec not_found(gleam@http@request:request(bitstring()), any()) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}.
not_found(_, _) ->
{ok, response_not_found()}.
-spec unmatched(gleam@http@request:request(bitstring()), any()) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}.
unmatched(_, _) ->
{error, unmatched}.
-spec json_response(gleam@json:json()) -> gleam@http@response:response(gleam@bit_builder:bit_builder()).
json_response(Data) ->
Body = begin
_pipe = Data,
_pipe@1 = gleam@json:to_string(_pipe),
gleam@bit_builder:from_string(_pipe@1)
end,
_pipe@2 = gleam@http@response:new(200),
_pipe@3 = gleam@http@response:set_body(_pipe@2, Body),
gleam@http@response:prepend_header(
_pipe@3,
<<"Content-Type"/utf8>>,
<<"application/json"/utf8>>
).
-spec response_not_found() -> gleam@http@response:response(gleam@bit_builder:bit_builder()).
response_not_found() ->
Body = gleam@bit_builder:from_string(<<"Not Found"/utf8>>),
_pipe = gleam@http@response:new(404),
gleam@http@response:set_body(_pipe, Body).
-spec response_unauthorised() -> gleam@http@response:response(gleam@bit_builder:bit_builder()).
response_unauthorised() ->
_pipe = gleam@http@response:new(401),
gleam@http@response:set_body(
_pipe,
gleam@bit_builder:from_string(<<"Unauthorized"/utf8>>)
).
-spec response_for_error(response_error()) -> gleam@http@response:response(gleam@bit_builder:bit_builder()).
response_for_error(Error) ->
case Error of
not_found ->
response_not_found();
unauthorised ->
response_unauthorised();
unmatched ->
response_not_found()
end.
-spec service(
fun((gleam@http@request:request(bitstring()), FDZ) -> {ok,
gleam@http@response:response(gleam@bit_builder:bit_builder())} |
{error, response_error()}),
FDZ
) -> fun((gleam@http@request:request(bitstring())) -> gleam@http@response:response(gleam@bit_builder:bit_builder())).
service(Handler, Context) ->
fun(Request) -> case Handler(Request, Context) of
{ok, Resp} ->
Resp;
{error, Error} ->
response_for_error(Error)
end end.