From d582d0d0d3ea9f2fd39f64efcdd9643c3a3255a9 Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Mon, 6 Jan 2025 16:10:06 +0100 Subject: [PATCH] address_object: Add birthday parsing --- .../store/src/addressbook/address_object.rs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/crates/store/src/addressbook/address_object.rs b/crates/store/src/addressbook/address_object.rs index 391bf60..21647cc 100644 --- a/crates/store/src/addressbook/address_object.rs +++ b/crates/store/src/addressbook/address_object.rs @@ -1,19 +1,39 @@ -use crate::Error; +use std::{collections::HashMap, io::BufReader}; + +use crate::{calendar::CalDateTime, Error}; +use ical::parser::{ + vcard::{self, component::VcardContact}, + Component, +}; use sha2::{Digest, Sha256}; #[derive(Debug, Clone)] pub struct AddressObject { id: String, vcf: String, + vcard: VcardContact, } impl AddressObject { pub fn from_vcf(object_id: String, vcf: String) -> Result { - Ok(Self { id: object_id, vcf }) + let mut parser = vcard::VcardParser::new(BufReader::new(vcf.as_bytes())); + let vcard = parser.next().ok_or(Error::NotFound)??; + if parser.next().is_some() { + return Err(Error::InvalidData( + "multiple vcards, only one allowed".to_owned(), + )); + } + Ok(Self { + id: object_id, + vcf, + vcard, + }) } + pub fn get_id(&self) -> &str { &self.id } + pub fn get_etag(&self) -> String { let mut hasher = Sha256::new(); hasher.update(&self.id); @@ -24,4 +44,9 @@ impl AddressObject { pub fn get_vcf(&self) -> &str { &self.vcf } + + pub fn get_birthday(&self) -> Option { + let prop = self.vcard.get_property("BDAY")?; + CalDateTime::parse_prop(prop, &HashMap::default()).unwrap_or(None) + } }