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_params(Args :: list()) -> [{Name :: nonempty_string(), Value :: nonempty_string()}].
-callback response(Response :: term()) -> term().
%% API
-export([request/3, response/2]).
request(Module, AuthKey, Args) ->
case body(Module, AuthKey, Args) of
{error, _Reason} = E -> E;
Body -> {uri(Module), header(Module), Body}
end.
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.
uri(Module) ->
Module:uri().
header(_Module) ->
[
{<<"content-type">>, "application/x-www-form-urlencoded"},
{<<"user-agent">>, "deeperl/0.1.0"}
].
body(Module, AuthKey, Args) ->
ModParams = Module:body_params(Args),
case Module:body_params(Args) of
{error, _Reason} = E -> E;
ModParams ->
Params = [{"auth_key", AuthKey}|ModParams],
ParamLines = [io_lib:format("~s=~s", [K, http_uri:encode(V)]) || {K, V} <- Params],
lists:flatten(string:join(ParamLines, "&"))
end.