-module(glitch@api@api_response). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([of_http_response/1, get_body/1, get_headers/1, get_data/2, get_list_data/2, get_eventsub_data/2]). -export_type([twitch_api_response/1, twitch_error_response/0, event_sub_data/1]). -opaque twitch_api_response(RLO) :: {twitch_api_response, gleam@http@response:response(RLO)}. -type twitch_error_response() :: {twitch_error_response, integer(), binary()}. -type event_sub_data(RLP) :: {event_sub_data, RLP, integer(), integer(), integer()}. -spec of_http_response(gleam@http@response:response(binary())) -> twitch_api_response(binary()). of_http_response(Response) -> {twitch_api_response, Response}. -spec get_http_response(twitch_api_response(RLS)) -> gleam@http@response:response(RLS). get_http_response(Api_response) -> case Api_response of {twitch_api_response, Response} -> Response end. -spec get_body(twitch_api_response(RLV)) -> RLV. get_body(Api_response) -> erlang:element(4, get_http_response(Api_response)). -spec get_headers(twitch_api_response(any())) -> list({binary(), binary()}). get_headers(Api_response) -> Http_response = get_http_response(Api_response), erlang:element(3, Http_response). -spec error_decoder() -> fun((gleam@dynamic:dynamic_()) -> {ok, twitch_error_response()} | {error, list(gleam@dynamic:decode_error())}). error_decoder() -> gleam@dynamic:decode2( fun(Field@0, Field@1) -> {twitch_error_response, Field@0, Field@1} end, gleam@dynamic:field(<<"status"/utf8>>, fun gleam@dynamic:int/1), gleam@dynamic:field(<<"message"/utf8>>, fun gleam@dynamic:string/1) ). -spec get_data( twitch_api_response(binary()), fun((gleam@dynamic:dynamic_()) -> {ok, RMC} | {error, list(gleam@dynamic:decode_error())}) ) -> {ok, RMC} | {error, glitch@error:twitch_error()}. get_data(Api_response, Data_decoder) -> Body = get_body(Api_response), Error = gleam@json:decode(Body, error_decoder()), case Error of {ok, {twitch_error_response, Status, Message}} -> {error, {response_error, Status, Message}}; _ -> _pipe = Body, _pipe@1 = gleam@json:decode( _pipe, gleam@dynamic:any( [Data_decoder, gleam@dynamic:field(<<"data"/utf8>>, Data_decoder)] ) ), gleam@result:map_error( _pipe@1, fun(Field@0) -> {response_decode_error, Field@0} end ) end. -spec get_list_data( twitch_api_response(binary()), fun((gleam@dynamic:dynamic_()) -> {ok, RMH} | {error, list(gleam@dynamic:decode_error())}) ) -> {ok, list(RMH)} | {error, glitch@error:twitch_error()}. get_list_data(Api_response, Data_decoder) -> Body = get_body(Api_response), Error = gleam@json:decode(Body, error_decoder()), case Error of {ok, {twitch_error_response, Status, Message}} -> {error, {response_error, Status, Message}}; _ -> _pipe = Body, _pipe@1 = gleam@json:decode( _pipe, gleam@dynamic:any( [gleam@dynamic:field( <<"data"/utf8>>, gleam@dynamic:list(Data_decoder) ), gleam@dynamic:list(Data_decoder)] ) ), gleam@result:map_error( _pipe@1, fun(Field@0) -> {response_decode_error, Field@0} end ) end. -spec eventsub_data_decoder( fun((gleam@dynamic:dynamic_()) -> {ok, RMM} | {error, list(gleam@dynamic:decode_error())}) ) -> fun((gleam@dynamic:dynamic_()) -> {ok, event_sub_data(list(RMM))} | {error, list(gleam@dynamic:decode_error())}). eventsub_data_decoder(Data_decoder) -> gleam@dynamic:decode4( fun(Field@0, Field@1, Field@2, Field@3) -> {event_sub_data, Field@0, Field@1, Field@2, Field@3} end, gleam@dynamic:field(<<"data"/utf8>>, gleam@dynamic:list(Data_decoder)), gleam@dynamic:field(<<"total"/utf8>>, fun gleam@dynamic:int/1), gleam@dynamic:field(<<"total_cost"/utf8>>, fun gleam@dynamic:int/1), gleam@dynamic:field(<<"max_total_cost"/utf8>>, fun gleam@dynamic:int/1) ). -spec get_eventsub_data( twitch_api_response(binary()), fun((gleam@dynamic:dynamic_()) -> {ok, RMS} | {error, list(gleam@dynamic:decode_error())}) ) -> {ok, event_sub_data(list(RMS))} | {error, glitch@error:twitch_error()}. get_eventsub_data(Api_response, Data_decoder) -> Body = get_body(Api_response), Error = gleam@json:decode(Body, error_decoder()), case Error of {ok, {twitch_error_response, Status, Message}} -> {error, {response_error, Status, Message}}; _ -> _pipe = Body, _pipe@1 = gleam@json:decode( _pipe, eventsub_data_decoder(Data_decoder) ), gleam@result:map_error( _pipe@1, fun(Field@0) -> {response_decode_error, Field@0} end ) end.