-module(plunk@contacts). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]). -export([get/2, list/1, count/1, create/2, subscribe/2, unsubscribe/2, delete/2, decode/2]). -export_type([action_result/0, for/0, create_contact_data/0, subscription_data/0]). -type action_result() :: {get_contact_result, plunk@internal@contacts_def:extended_contact()} | {list_contacts_result, list(plunk@internal@contacts_def:contact())} | {count_contacts_result, plunk@internal@contacts_def:count()} | {create_contact_result, plunk@internal@contacts_def:created_contact()} | {subscription_result, plunk@internal@contacts_def:subscription()} | {delete_contact_result, plunk@internal@contacts_def:deleted_contact()}. -type for() :: get_contact | list_contacts | count_contacts | create_contact | subscribe | unsubscribe | delete_contact. -type create_contact_data() :: {create_contact_data, binary(), boolean(), gleam@option:option(list({binary(), binary()}))}. -type subscription_data() :: {subscription, binary()}. -spec get(plunk@instance:instance(), binary()) -> gleam@http@request:request(binary()). get(Instance, Contact_id) -> plunk@internal@bridge:make_request( Instance, <<"/contacts/"/utf8, Contact_id/binary>>, get, <<""/utf8>> ). -spec list(plunk@instance:instance()) -> gleam@http@request:request(binary()). list(Instance) -> plunk@internal@bridge:make_request( Instance, <<"/contacts"/utf8>>, get, <<""/utf8>> ). -spec count(plunk@instance:instance()) -> gleam@http@request:request(binary()). count(Instance) -> plunk@internal@bridge:make_request( Instance, <<"/contacts/count"/utf8>>, get, <<""/utf8>> ). -spec create(plunk@instance:instance(), create_contact_data()) -> gleam@http@request:request(binary()). create(Instance, Contact) -> Body = begin _pipe = [{<<"email"/utf8>>, gleam@json:string(erlang:element(2, Contact))}, {<<"subscribed"/utf8>>, gleam@json:bool(erlang:element(3, Contact))}], _pipe@3 = (fun(Fields) -> case erlang:element(4, Contact) of {some, D} -> [{<<"data"/utf8>>, begin _pipe@1 = D, _pipe@2 = gleam@list:map( _pipe@1, fun(Data) -> {erlang:element(1, Data), gleam@json:string( erlang:element(2, Data) )} end ), gleam@json:object(_pipe@2) end} | Fields]; none -> Fields end end)(_pipe), _pipe@4 = gleam@json:object(_pipe@3), gleam@json:to_string(_pipe@4) end, plunk@internal@bridge:make_request( Instance, <<"/contacts"/utf8>>, post, Body ). -spec subscribe(plunk@instance:instance(), binary()) -> gleam@http@request:request(binary()). subscribe(Instance, Id) -> plunk@internal@bridge:make_request( Instance, <<"/contacts/subscribe"/utf8>>, post, begin _pipe = gleam@json:object([{<<"id"/utf8>>, gleam@json:string(Id)}]), gleam@json:to_string(_pipe) end ). -spec unsubscribe(plunk@instance:instance(), binary()) -> gleam@http@request:request(binary()). unsubscribe(Instance, Id) -> plunk@internal@bridge:make_request( Instance, <<"/contacts/unsubscribe"/utf8>>, post, begin _pipe = gleam@json:object([{<<"id"/utf8>>, gleam@json:string(Id)}]), gleam@json:to_string(_pipe) end ). -spec delete(plunk@instance:instance(), binary()) -> gleam@http@request:request(binary()). delete(Instance, Id) -> plunk@internal@bridge:make_request( Instance, <<"/contacts"/utf8>>, delete, begin _pipe = gleam@json:object([{<<"id"/utf8>>, gleam@json:string(Id)}]), gleam@json:to_string(_pipe) end ). -spec try_decode( gleam@http@response:response(binary()), fun((IAQ) -> action_result()), fun(() -> fun((gleam@dynamic:dynamic_()) -> {ok, IAQ} | {error, list(gleam@dynamic:decode_error())})) ) -> {ok, action_result()} | {error, plunk@types:plunk_error()}. try_decode(Res, Constructor, Decoder) -> gleam@result:'try'( plunk@internal@bridge:decode(Res, Decoder), fun(D) -> {ok, Constructor(D)} end ). -spec decode(gleam@http@response:response(binary()), for()) -> {ok, action_result()} | {error, plunk@types:plunk_error()}. decode(Res, For) -> case For of get_contact -> try_decode( Res, fun(Field@0) -> {get_contact_result, Field@0} end, fun plunk@internal@contacts_def:get_contact_decoder/0 ); list_contacts -> try_decode( Res, fun(Field@0) -> {list_contacts_result, Field@0} end, fun plunk@internal@contacts_def:list_contacts_decoder/0 ); count_contacts -> try_decode( Res, fun(Field@0) -> {count_contacts_result, Field@0} end, fun plunk@internal@contacts_def:count_decoder/0 ); create_contact -> try_decode( Res, fun(Field@0) -> {create_contact_result, Field@0} end, fun plunk@internal@contacts_def:created_contact_decoder/0 ); delete_contact -> try_decode( Res, fun(Field@0) -> {delete_contact_result, Field@0} end, fun plunk@internal@contacts_def:deleted_contact_decoder/0 ); subscribe -> try_decode( Res, fun(Field@0) -> {subscription_result, Field@0} end, fun plunk@internal@contacts_def:subscription_decoder/0 ); unsubscribe -> try_decode( Res, fun(Field@0) -> {subscription_result, Field@0} end, fun plunk@internal@contacts_def:subscription_decoder/0 ) end.