diff --git a/crates/carddav/src/addressbook/methods/report/addressbook_query/elements.rs b/crates/carddav/src/addressbook/methods/report/addressbook_query/elements.rs index 2a4a105..ca34a11 100644 --- a/crates/carddav/src/addressbook/methods/report/addressbook_query/elements.rs +++ b/crates/carddav/src/addressbook/methods/report/addressbook_query/elements.rs @@ -105,4 +105,30 @@ pub struct AddressbookQueryRequest { pub prop: PropfindType, #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] pub(crate) filter: FilterElement, + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] + pub(crate) limit: Option, } + +// https://datatracker.ietf.org/doc/html/rfc5323#section-5.17 +#[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)] +pub struct LimitElement { + #[xml(ns = "rustical_dav::namespace::NS_CARDDAV")] + pub nresults: NresultsElement, +} + +impl From for LimitElement { + fn from(value: u64) -> Self { + Self { + nresults: NresultsElement(value), + } + } +} + +impl From for u64 { + fn from(value: LimitElement) -> Self { + value.nresults.0 + } +} + +#[derive(XmlDeserialize, Clone, Debug, PartialEq, Eq)] +pub struct NresultsElement(#[xml(ty = "text")] pub u64); diff --git a/crates/carddav/src/addressbook/methods/report/mod.rs b/crates/carddav/src/addressbook/methods/report/mod.rs index 9c6a08b..dfba5e0 100644 --- a/crates/carddav/src/addressbook/methods/report/mod.rs +++ b/crates/carddav/src/addressbook/methods/report/mod.rs @@ -159,7 +159,7 @@ mod tests { use crate::{ address_object::AddressObjectPropName, addressbook::methods::report::addressbook_query::{ - Allof, FilterElement, PropFilterElement, + Allof, FilterElement, LimitElement, NresultsElement, PropFilterElement, }, }; use rustical_dav::xml::{PropElement, sync_collection::SyncLevel}; @@ -237,6 +237,9 @@ mod tests { + + 100 + "#, ) @@ -259,8 +262,11 @@ mod tests { text_match: vec![], param_filter: vec![], test: Allof::default() - }] - } + }], + }, + limit: Some(LimitElement { + nresults: NresultsElement(100) + }) }) ); }