From 829f7b727fe9f4f63550d0d1e2833b0e86b2cc5d Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Wed, 31 Dec 2025 15:15:07 +0100 Subject: [PATCH] carddav calendar-query: Add parsing support for limit --- .../report/addressbook_query/elements.rs | 26 +++++++++++++++++++ .../src/addressbook/methods/report/mod.rs | 12 ++++++--- 2 files changed, 35 insertions(+), 3 deletions(-) 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) + }) }) ); }