-module(gdav@multiget_contacts).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/gdav/multiget_contacts.gleam").
-export([request/2, build/2, response/1]).
-export_type([request_builder/0]).
-type request_builder() :: {request_builder, binary(), list(binary())}.
-file("src/gdav/multiget_contacts.gleam", 15).
-spec request(binary(), list(binary())) -> request_builder().
request(Collection_path, Hrefs) ->
{request_builder, Collection_path, Hrefs}.
-file("src/gdav/multiget_contacts.gleam", 19).
-spec build(request_builder(), gdav:credentials()) -> gleam@http@request:request(binary()).
build(Builder, Credentials) ->
Headers = [{<<"Depth"/utf8>>, <<"1"/utf8>>},
{<<"Content-Type"/utf8>>, <<"application/xml; charset=utf-8"/utf8>>}],
Href_elements = begin
_pipe = gleam@list:map(
erlang:element(3, Builder),
fun(Href) ->
<<<<"<d:href>"/utf8, Href/binary>>/binary, "</d:href>"/utf8>>
end
),
gleam@string:join(_pipe, <<""/utf8>>)
end,
Body = <<<<<<<<<<<<"<card:addressbook-multiget xmlns:d=\"DAV:\" xmlns:card=\"urn:ietf:params:xml:ns:carddav\">"/utf8,
"<d:prop>"/utf8>>/binary,
"<d:getetag />"/utf8>>/binary,
"<card:address-data />"/utf8>>/binary,
"</d:prop>"/utf8>>/binary,
Href_elements/binary>>/binary,
"</card:addressbook-multiget>"/utf8>>,
gdav@internal:request(
Credentials,
{other, <<"REPORT"/utf8>>},
erlang:element(2, Builder),
Headers,
Body
).
-file("src/gdav/multiget_contacts.gleam", 49).
-spec response(gleam@http@response:response(binary())) -> {ok,
list(gdav:contact_entry())} |
{error, gdav:dav_error()}.
response(Res) ->
case erlang:element(2, Res) of
S when (S >= 200) andalso (S < 300) ->
gleam@result:'try'(
gdav@internal@xml:parse_multistatus(erlang:element(4, Res)),
fun(Responses) ->
Entries = gleam@list:filter_map(
Responses,
fun(R) ->
Find = fun(Ns, Local) ->
gdav@internal@xml:find_text(
erlang:element(4, R),
Ns,
Local
)
end,
case {Find(<<"DAV:"/utf8>>, <<"getetag"/utf8>>),
Find(
<<"urn:ietf:params:xml:ns:carddav"/utf8>>,
<<"address-data"/utf8>>
)} of
{{ok, Etag}, {ok, Data}} ->
{ok,
{contact_entry,
erlang:element(2, R),
Etag,
Data}};
{_, _} ->
{error, nil}
end
end
),
{ok, Entries}
end
);
404 ->
{error, not_found};
401 ->
{error, authentication_failed};
403 ->
{error, authentication_failed};
_ ->
{error, {unexpected_response, Res}}
end.