use alloc::collections::BTreeSet;
use log::trace;
use url::Url;
use crate::{
coroutine::*,
rfc4918::{WebdavAuth, report::Report, send::SendError},
rfc6352::{
addressbook::addressbook_query_body,
card::{CARD_PROPS, CardEntry, card_from_entry},
},
webdav_try,
};
#[derive(Debug)]
pub struct ListCards {
state: State,
}
impl ListCards {
pub fn new(
base_url: &Url,
auth: &WebdavAuth,
user_agent: &str,
addressbook_path: &str,
) -> Self {
let body = addressbook_query_body(CARD_PROPS);
let report = Report::new(base_url, auth, user_agent, addressbook_path, 1, body);
Self {
state: State::Report(report),
}
}
}
impl WebdavCoroutine for ListCards {
type Yield = WebdavYield;
type Return = Result<BTreeSet<CardEntry>, SendError>;
fn resume(&mut self, arg: Option<&[u8]>) -> WebdavCoroutineState<Self::Yield, Self::Return> {
trace!("sending request");
match &mut self.state {
State::Report(report) => {
let multistatus = webdav_try!(report, arg);
let cards = multistatus
.responses
.iter()
.filter_map(card_from_entry)
.collect();
WebdavCoroutineState::Complete(Ok(cards))
}
}
}
}
#[derive(Debug)]
enum State {
Report(Report),
}