Current section
Files
Jump to
Current section
Files
src/deeperl_client.erl
%% @private
-module(deeperl_client).
-export([
call/2
]).
-spec call ({atom() | pid(), nonempty_string()}, {module(), tuple()}) -> term().
call({HttpcProfile, AuthKey}, {DeeplModule, Arguments}) ->
{Method, RequestData} = DeeplModule:request(Arguments),
Request = case RequestData of
{Route, Headers, ContentType, Body} ->
{url(AuthKey, Route), Headers ++ headers(AuthKey), ContentType, Body};
{Route, Headers} -> {url(AuthKey, Route), Headers ++ headers(AuthKey)}
end,
{ok, Response} = httpc:request(Method, Request, [], [], HttpcProfile),
{{_, StatusCode, StatusMessage}, _, ResponseBody} = Response,
case StatusCode of
400 -> {error, badrequest, StatusMessage};
401 -> {error, authfailed, StatusMessage};
403 -> {error, forbidden, StatusMessage};
404 -> {error, notfound, StatusMessage};
413 -> {error, requestsize, StatusMessage};
415 -> {error, notsupported, StatusMessage};
429 -> {error, toomanyrequests, StatusMessage};
456 -> {error, quotaexceeded, StatusMessage};
503 -> {error, resourceunavailable, StatusMessage};
529 -> {error, toomanyrequests, StatusMessage};
Code when Code >= 500 -> {error, internalerror, {StatusCode, StatusMessage}};
Code when Code >= 200, Code =< 299 -> DeeplModule:response(ResponseBody)
end.
host(AuthKey) ->
case string:right(AuthKey, 3) of
":fx" -> "api-free.deepl.com";
_ -> "api.deepl.com"
end.
url(AuthKey, Route) ->
"https://" ++ host(AuthKey) ++ Route.
headers(AuthKey) ->
[
{"Authorization", "DeepL-Auth-Key " ++ AuthKey},
{"User-Agent", "deeperl/" ++ vsn() ++ " (https://codeberg.org/l-x/deeperl)"}
].
vsn() ->
case application:get_key(vsn) of
{ok, Vsn} -> Vsn;
_ -> "unknown"
end.