Current section

Files

Jump to
gleamql src gleamql.erl
Raw

src/gleamql.erl

-module(gleamql).
-compile(no_auto_import).
-export([new/0, set_query/2, set_variable/3, send/2, set_host/2, set_path/2, set_header/3, decode/2]).
-export_type([request/1, graph_ql_error/0, gql_success/1, gql_errors/0, gql_error/0]).
-type request(GVA) :: {request,
gleam@http@request:request(binary()),
gleam@option:option(binary()),
gleam@option:option(list({binary(), gleam@json:json()})),
gleam@option:option(fun((gleam@dynamic:dynamic()) -> {ok, GVA} |
{error, list(gleam@dynamic:decode_error())}))}.
-type graph_ql_error() :: {error_message, binary()} |
{unexpected_status, integer()} |
{unrecognised_response, binary()} |
{unknown_error, gleam@dynamic:dynamic()}.
-type gql_success(GVB) :: {success_response, GVB}.
-type gql_errors() :: {error_response, list(gql_error())}.
-type gql_error() :: {gql_error, binary()}.
-spec new() -> request(any()).
new() ->
{request,
begin
_pipe = gleam@http@request:new(),
gleam@http@request:set_method(_pipe, post)
end,
none,
none,
none}.
-spec set_query(request(GVS), binary()) -> request(GVS).
set_query(Req, Query) ->
erlang:setelement(3, Req, {some, Query}).
-spec set_variable(request(GVV), binary(), gleam@json:json()) -> request(GVV).
set_variable(Req, Key, Value) ->
Variables = [{Key, Value} |
begin
_pipe = erlang:element(4, Req),
gleam@option:unwrap(_pipe, gleam@list:new())
end],
erlang:setelement(4, Req, {some, Variables}).
-spec send(
request(GVY),
fun((gleam@http@request:request(binary())) -> {ok,
gleam@http@response:response(binary())} |
{error, any()})
) -> {ok, gleam@option:option(GVY)} | {error, graph_ql_error()}.
send(Req, Send) ->
Request = begin
_pipe = erlang:element(2, Req),
gleam@http@request:set_body(
_pipe,
begin
_pipe@4 = gleam@json:object(
[{<<"query"/utf8>>,
begin
_pipe@1 = erlang:element(3, Req),
_pipe@2 = gleam@option:unwrap(
_pipe@1,
<<""/utf8>>
),
gleam@json:string(_pipe@2)
end},
{<<"variables"/utf8>>,
gleam@json:object(
begin
_pipe@3 = erlang:element(4, Req),
gleam@option:unwrap(
_pipe@3,
gleam@list:new()
)
end
)}]
),
gleam@json:to_string(_pipe@4)
end
)
end,
case begin
_pipe@5 = Request,
_pipe@6 = Send(_pipe@5),
gleam@result:map_error(
_pipe@6,
fun(E) -> {unknown_error, gleam@dynamic:from(E)} end
)
end of
{error, _try} -> {error, _try};
{ok, Resp} ->
Errors_decoder = gleam@dynamic:decode1(
fun(Field@0) -> {error_response, Field@0} end,
gleam@dynamic:field(
<<"errors"/utf8>>,
gleam@dynamic:list(
gleam@dynamic:decode1(
fun(Field@0) -> {gql_error, Field@0} end,
gleam@dynamic:field(
<<"message"/utf8>>,
fun gleam@dynamic:string/1
)
)
)
)
),
case begin
_pipe@7 = erlang:element(2, Resp),
status_is_ok(_pipe@7)
end of
true ->
case erlang:element(5, Req) of
{some, Decoder} ->
case gleam@json:decode(
erlang:element(4, Resp),
gleam@dynamic:decode1(
fun(Field@0) -> {success_response, Field@0} end,
gleam@dynamic:field(
<<"data"/utf8>>,
Decoder
)
)
) of
{ok, Response} ->
{ok, {some, erlang:element(2, Response)}};
{error, _} ->
{error,
{unrecognised_response,
erlang:element(4, Resp)}}
end;
none ->
{ok, none}
end;
false ->
case gleam@json:decode(
erlang:element(4, Resp),
Errors_decoder
) of
{ok, Response@1} ->
case begin
_pipe@8 = erlang:element(2, Response@1),
gleam@list:first(_pipe@8)
end of
{ok, Error} ->
{error,
{error_message,
erlang:element(2, Error)}};
{error, _} ->
{error,
{unrecognised_response,
erlang:element(4, Resp)}}
end;
{error, _} ->
{error,
{unexpected_status, erlang:element(2, Resp)}}
end
end
end.
-spec set_host(request(GWI), binary()) -> request(GWI).
set_host(Req, Host) ->
erlang:setelement(
2,
Req,
begin
_pipe = erlang:element(2, Req),
gleam@http@request:set_host(_pipe, Host)
end
).
-spec set_path(request(GWL), binary()) -> request(GWL).
set_path(Req, Path) ->
erlang:setelement(
2,
Req,
begin
_pipe = erlang:element(2, Req),
gleam@http@request:set_path(_pipe, Path)
end
).
-spec set_header(request(GWO), binary(), binary()) -> request(GWO).
set_header(Req, Key, Value) ->
erlang:setelement(
2,
Req,
begin
_pipe = erlang:element(2, Req),
gleam@http@request:set_header(_pipe, Key, Value)
end
).
-spec status_is_ok(integer()) -> boolean().
status_is_ok(Status) ->
Status =:= 200.
-spec decode(
request(GWR),
fun((gleam@dynamic:dynamic()) -> {ok, GWR} |
{error, list(gleam@dynamic:decode_error())})
) -> request(GWR).
decode(Req, Decoder) ->
erlang:setelement(5, Req, {some, Decoder}).