Make AddressObject object_id an extrinsic property

This commit is contained in:
Lennart K
2026-01-07 12:19:30 +01:00
parent a9f3833a32
commit 758793a11a
15 changed files with 98 additions and 94 deletions

View File

@@ -9,30 +9,19 @@ use std::{collections::HashMap, io::BufReader};
#[derive(Debug, Clone)]
pub struct AddressObject {
id: String,
vcf: String,
vcard: VcardContact,
}
impl TryFrom<VcardContact> for AddressObject {
type Error = Error;
fn try_from(vcard: VcardContact) -> Result<Self, Self::Error> {
let uid = vcard
.get_uid()
.ok_or_else(|| Error::InvalidData("missing UID".to_owned()))?
.to_owned();
impl From<VcardContact> for AddressObject {
fn from(vcard: VcardContact) -> Self {
let vcf = vcard.generate();
Ok(Self {
vcf,
vcard,
id: uid,
})
Self { vcf, vcard }
}
}
impl AddressObject {
pub fn from_vcf(id: String, vcf: String) -> Result<Self, Error> {
pub fn from_vcf(vcf: String) -> Result<Self, Error> {
let mut parser = vcard::VcardParser::new(BufReader::new(vcf.as_bytes()));
let vcard = parser.next().ok_or(Error::MissingContact)??;
if parser.next().is_some() {
@@ -40,18 +29,12 @@ impl AddressObject {
"multiple vcards, only one allowed".to_owned(),
));
}
Ok(Self { id, vcf, vcard })
}
#[must_use]
pub fn get_id(&self) -> &str {
&self.id
Ok(Self { vcf, vcard })
}
#[must_use]
pub fn get_etag(&self) -> String {
let mut hasher = Sha256::new();
hasher.update(self.get_id());
hasher.update(self.get_vcf());
format!("\"{:x}\"", hasher.finalize())
}