-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.