Current section
Files
Jump to
Current section
Files
src/gen_deeperl_procedure.erl
%%% @private
-module(gen_deeperl_procedure).
%% Callbacks
-callback uri() -> Uri :: nonempty_string().
-callback body(Args :: tuple()) -> iodata().
-callback response(Response :: map()) -> term().
%% API
-export([request/3, response/2]).
-spec request(Module :: module(), AuthKey :: nonempty_string(), Args :: term()) ->
{Uri :: nonempty_string(), Header :: [{Name :: binary(), Value :: iodata()}], Body :: iodata()} | {error, term()}.
request(Module, AuthKey, Args) ->
case body(Module, AuthKey, Args) of
{error, _Reason} = E -> E;
Body -> {uri(Module), header(Module), Body}
end.
-spec response(Module :: module(), Response :: binary()) -> term().
response(Module, Response) ->
case catch Module:response(jiffy:decode(Response, [return_maps])) of
{'EXIT', {{_, E}, _}} -> {error, {E, Response}};
{error, E} -> {error, {E, Response}};
R -> R
end.
-spec uri(Module :: module()) -> nonempty_string().
uri(Module) ->
Module:uri().
-spec header(Module :: module()) -> [{Name :: binary(), Value :: iodata()}].
header(_Module) ->
[
{<<"content-type">>, "application/x-www-form-urlencoded; charset=utf-8"},
{<<"user-agent">>, "deeperl/0.1.0"}
].
-spec body(Module :: module(), AuthKey :: nonempty_string(), Args :: term()) -> iodata() | {error, term()}.
body(Module, AuthKey, Args) ->
case Module:body(Args) of
{error, _Reason} = E -> E;
ModParams -> [["auth_key=", AuthKey]|ModParams]
end.