Current section

Files

Jump to
glitr_wisp src glitr_wisp.erl
Raw

src/glitr_wisp.erl

-module(glitr_wisp).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([for/1, unwrap/1, 'try'/3, try_map/4]).
-export_type([router/0]).
-opaque router() :: {router,
gleam@http@request:request(wisp@internal:connection())}.
-spec for(gleam@http@request:request(wisp@internal:connection())) -> {ok,
router()} |
{error, gleam@http@response:response(wisp:body())}.
for(Req) ->
{ok, {router, Req}}.
-spec unwrap(
{ok, router()} | {error, gleam@http@response:response(wisp:body())}
) -> gleam@http@response:response(wisp:body()).
unwrap(Router_res) ->
case Router_res of
{ok, _} ->
wisp:not_found();
{error, Response} ->
Response
end.
-spec handle_path(
gleam@http@request:request(wisp@internal:connection()),
glitr@route:route(UCV, any(), any(), any()),
fun((UCV) -> {ok, gleam@http@response:response(wisp:body())} | {error, nil})
) -> {ok, gleam@http@response:response(wisp:body())} | {error, nil}.
handle_path(Req, Route, Callback) ->
Path_result = begin
_pipe = Req,
_pipe@1 = fun gleam@http@request:path_segments/1(_pipe),
glitr@path:decode(erlang:element(3, Route), _pipe@1)
end,
case Path_result of
{ok, Path} ->
Callback(Path);
{error, _} ->
{error, nil}
end.
-spec handle_query(
gleam@http@request:request(wisp@internal:connection()),
glitr@route:route(any(), UDI, any(), any()),
fun((UDI) -> {ok, gleam@http@response:response(wisp:body())} | {error, nil})
) -> {ok, gleam@http@response:response(wisp:body())} | {error, nil}.
handle_query(Req, Route, Callback) ->
Path_result = begin
_pipe = Req,
_pipe@1 = wisp:get_query(_pipe),
glitr@query:decode(erlang:element(4, Route), _pipe@1)
end,
case Path_result of
{ok, Path} ->
Callback(Path);
{error, _} ->
{error, nil}
end.
-spec handle_body(
gleam@http@request:request(wisp@internal:connection()),
glitr@route:route(any(), any(), UDV, any()),
fun((UDV) -> gleam@http@response:response(wisp:body()))
) -> {ok, gleam@http@response:response(wisp:body())} | {error, nil}.
handle_body(Req, Route, Callback) ->
Call_callback = fun(Res) -> case Res of
{ok, Value} ->
Callback(Value);
{error, _} ->
_pipe = wisp:bad_request(),
wisp:string_body(
_pipe,
<<"Error while decoding body as JSON"/utf8>>
)
end end,
Body = case begin
_pipe@1 = erlang:element(5, Route),
glitr@body:get_type(_pipe@1)
end of
empty_body ->
_pipe@2 = erlang:element(5, Route),
_pipe@3 = glitr@body:decode(_pipe@2, <<""/utf8>>),
Call_callback(_pipe@3);
json_body ->
wisp:require_string_body(
Req,
fun(Value@1) ->
gleam@bool:guard(
begin
_pipe@4 = erlang:element(3, Req),
gleam@list:key_find(
_pipe@4,
<<"content-type"/utf8>>
)
end
/= {ok, <<"application/json"/utf8>>},
wisp:unsupported_media_type(
[<<"application/json"/utf8>>]
),
fun() -> _pipe@5 = erlang:element(5, Route),
_pipe@6 = glitr@body:decode(_pipe@5, Value@1),
Call_callback(_pipe@6) end
)
end
);
string_body ->
wisp:require_string_body(
Req,
fun(Value@2) -> _pipe@7 = erlang:element(5, Route),
_pipe@8 = glitr@body:decode(_pipe@7, Value@2),
Call_callback(_pipe@8) end
)
end,
{ok, Body}.
-spec handle_result(
glitr@route:route(any(), any(), any(), UEG),
fun(() -> {ok, UEG} | {error, glitr_wisp@errors:app_error()})
) -> gleam@http@response:response(wisp:body()).
handle_result(Route, Handler) ->
Result = Handler(),
case Result of
{error, {decoder_error, Msg}} ->
_pipe = wisp:bad_request(),
wisp:set_body(_pipe, {text, gleam@string_builder:from_string(Msg)});
{error, {db_error, Msg@1}} ->
_pipe@1 = wisp:internal_server_error(),
wisp:set_body(
_pipe@1,
{text, gleam@string_builder:from_string(Msg@1)}
);
{error, {internal_error, Msg@2}} ->
_pipe@2 = wisp:internal_server_error(),
wisp:set_body(
_pipe@2,
{text, gleam@string_builder:from_string(Msg@2)}
);
{ok, Res} ->
case begin
_pipe@3 = erlang:element(6, Route),
glitr@body:get_type(_pipe@3)
end of
json_body ->
_pipe@4 = erlang:element(6, Route),
_pipe@5 = glitr@body:encode(_pipe@4, Res),
wisp:json_response(_pipe@5, 200);
string_body ->
_pipe@6 = wisp:ok(),
wisp:set_body(
_pipe@6,
{text,
begin
_pipe@7 = erlang:element(6, Route),
glitr@body:encode(_pipe@7, Res)
end}
);
empty_body ->
wisp:ok()
end
end.
-spec 'receive'(
gleam@http@request:request(wisp@internal:connection()),
glitr@route:route(UCG, UCH, UCI, UCJ),
fun((glitr:route_options(UCG, UCH, UCI)) -> {ok, UCJ} |
{error, glitr_wisp@errors:app_error()})
) -> {ok, gleam@http@response:response(wisp:body())} | {error, nil}.
'receive'(Req, Route, Handler) ->
gleam@bool:guard(
erlang:element(2, Req) /= erlang:element(2, Route),
{error, nil},
fun() ->
handle_path(
Req,
Route,
fun(Path) ->
handle_query(
Req,
Route,
fun(Query) ->
handle_body(
Req,
Route,
fun(Body) ->
handle_result(
Route,
fun() ->
Handler(
{route_options,
Path,
Query,
Body}
)
end
)
end
)
end
)
end
)
end
).
-spec 'try'(
{ok, router()} | {error, gleam@http@response:response(wisp:body())},
glitr@route:route(UAY, UAZ, UBA, UBB),
fun((glitr:route_options(UAY, UAZ, UBA)) -> {ok, UBB} |
{error, glitr_wisp@errors:app_error()})
) -> {ok, router()} | {error, gleam@http@response:response(wisp:body())}.
'try'(Router_res, Route, Handler) ->
gleam@result:'try'(
Router_res,
fun(Router) ->
Result = 'receive'(erlang:element(2, Router), Route, Handler),
case Result of
{ok, Response} ->
{error, Response};
{error, nil} ->
{ok, Router}
end
end
).
-spec try_map(
{ok, router()} | {error, gleam@http@response:response(wisp:body())},
glitr@route:route(UBP, UBQ, UBR, UBS),
fun((glitr:route_options(UBP, UBQ, UBR)) -> {ok, UBS} |
{error, glitr_wisp@errors:app_error()}),
fun((gleam@http@response:response(wisp:body())) -> gleam@http@response:response(wisp:body()))
) -> {ok, router()} | {error, gleam@http@response:response(wisp:body())}.
try_map(Router_res, Route, Handler, Map_fn) ->
gleam@result:'try'(
Router_res,
fun(Router) ->
Result = 'receive'(erlang:element(2, Router), Route, Handler),
case Result of
{ok, Response} ->
{error,
begin
_pipe = Response,
Map_fn(_pipe)
end};
{error, nil} ->
{ok, Router}
end
end
).