Current section

Files

Jump to
glitch src glitch@api@user.erl
Raw

src/glitch@api@user.erl

-module(glitch@api@user).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([to_json/1, from_json/1, query_params_from_get_users_request/1, get_users/2]).
-export_type([user/0, get_users_request/0, get_users_error/0]).
-type user() :: {user,
binary(),
binary(),
binary(),
binary(),
binary(),
binary(),
gleam@uri:uri(),
gleam@uri:uri(),
integer(),
gleam@option:option(binary()),
binary()}.
-type get_users_request() :: {get_users_request,
gleam@option:option(list(binary())),
gleam@option:option(list(binary()))}.
-type get_users_error() :: {decode_error, gleam@json:decode_error()} |
request_error.
-spec decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, user()} |
{error, list(gleam@dynamic:decode_error())}).
decoder() ->
glitch@extended@dynamic_ext:decode11(
fun(Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8, Field@9, Field@10) -> {user, Field@0, Field@1, Field@2, Field@3, Field@4, Field@5, Field@6, Field@7, Field@8, Field@9, Field@10} end,
gleam@dynamic:field(<<"id"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"login"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"display_name"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(<<"type"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(
<<"broadcaster_type"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(<<"description"/utf8>>, fun gleam@dynamic:string/1),
gleam@dynamic:field(
<<"profile_image_url"/utf8>>,
fun glitch@extended@dynamic_ext:uri/1
),
gleam@dynamic:field(
<<"offline_image_url"/utf8>>,
fun glitch@extended@dynamic_ext:uri/1
),
gleam@dynamic:field(<<"view_count"/utf8>>, fun gleam@dynamic:int/1),
gleam@dynamic:optional_field(
<<"email"/utf8>>,
fun gleam@dynamic:string/1
),
gleam@dynamic:field(<<"created_at"/utf8>>, fun gleam@dynamic:string/1)
).
-spec to_json(user()) -> gleam@json:json().
to_json(User) ->
gleam@json:object(
[{<<"id"/utf8>>, gleam@json:string(erlang:element(2, User))},
{<<"login"/utf8>>, gleam@json:string(erlang:element(3, User))},
{<<"display_name"/utf8>>,
gleam@json:string(erlang:element(4, User))},
{<<"type"/utf8>>, gleam@json:string(erlang:element(5, User))},
{<<"broadcaster_type"/utf8>>,
gleam@json:string(erlang:element(6, User))},
{<<"description"/utf8>>, gleam@json:string(erlang:element(7, User))},
{<<"profile_image_url"/utf8>>,
glitch@extended@json_ext:uri(erlang:element(8, User))},
{<<"offline_image_url"/utf8>>,
glitch@extended@json_ext:uri(erlang:element(9, User))},
{<<"view_count"/utf8>>, gleam@json:int(erlang:element(10, User))},
{<<"email"/utf8>>,
glitch@extended@json_ext:option(
erlang:element(11, User),
fun gleam@json:string/1
)},
{<<"created_at"/utf8>>, gleam@json:string(erlang:element(12, User))}]
).
-spec from_json(binary()) -> {ok, user()} | {error, gleam@json:decode_error()}.
from_json(Json_string) ->
gleam@json:decode(Json_string, decoder()).
-spec query_params_from_get_users_request(get_users_request()) -> list({binary(),
binary()}).
query_params_from_get_users_request(Req) ->
To_query_param_list = fun(Input) -> _pipe = erlang:element(2, Input),
_pipe@2 = gleam@option:map(_pipe, fun(Values) -> _pipe@1 = Values,
gleam@list:map(
_pipe@1,
fun(Value) -> {erlang:element(1, Input), Value} end
) end),
gleam@option:unwrap(_pipe@2, []) end,
_pipe@3 = [{<<"id"/utf8>>, erlang:element(2, Req)},
{<<"login"/utf8>>, erlang:element(3, Req)}],
_pipe@4 = gleam@list:map(_pipe@3, To_query_param_list),
gleam@list:flatten(_pipe@4).
-spec get_users(glitch@api@client:client(), get_users_request()) -> {ok,
gleam@http@response:response(list(user()))} |
{error, get_users_error()}.
get_users(Client, Request) ->
Request@1 = begin
_pipe = gleam@http@request:new(),
_pipe@1 = gleam@http@request:set_body(
_pipe,
gleam@json:string(<<""/utf8>>)
),
_pipe@2 = gleam@http@request:set_query(
_pipe@1,
query_params_from_get_users_request(Request)
),
gleam@http@request:set_path(_pipe@2, <<"users"/utf8>>)
end,
gleam@result:'try'(
begin
_pipe@3 = Client,
_pipe@4 = glitch@api@client:get(_pipe@3, Request@1),
gleam@result:replace_error(_pipe@4, request_error)
end,
fun(Response) -> _pipe@5 = Response,
_pipe@6 = gleam@http@response:try_map(
_pipe@5,
fun(_capture) ->
glitch@api@api_response:from_json(_capture, decoder())
end
),
_pipe@7 = gleam@result:'try'(
_pipe@6,
fun glitch@api@api_response:get_data_from_response/1
),
gleam@result:map_error(
_pipe@7,
fun(Field@0) -> {decode_error, Field@0} end
) end
).