vcard_parser/vcard/property/
property_member.rs

1use crate::constants::{Cardinality, ParameterName, PropertyName, ValueType};
2use crate::traits::{HasCardinality, HasGroup, HasName, HasParameters, HasValue};
3use crate::vcard::parameter::Parameter;
4use crate::vcard::value::value_uri::ValueUriData;
5use crate::vcard::value::Value;
6use crate::vcard::value::Value::ValueUri;
7use crate::VcardError;
8
9#[derive(Clone, Debug, PartialEq)]
10pub struct PropertyMemberData {
11    group: Option<String>,
12    parameters: Vec<Parameter>,
13    value: Value,
14}
15
16impl HasCardinality for PropertyMemberData {
17    fn cardinality(&self) -> &str {
18        Cardinality::MULTIPLE
19    }
20}
21
22impl HasGroup for PropertyMemberData {
23    fn group(&self) -> &Option<String> {
24        &self.group
25    }
26}
27
28impl HasName for PropertyMemberData {
29    fn name(&self) -> &str {
30        PropertyName::MEMBER
31    }
32}
33
34impl HasParameters for PropertyMemberData {
35    fn allowed_parameters<'a>(&self) -> Vec<&'a str> {
36        Vec::from([
37            ParameterName::ALTID,
38            ParameterName::ANY,
39            ParameterName::INDEX,
40            ParameterName::MEDIATYPE,
41            ParameterName::PID,
42            ParameterName::PREF,
43            ParameterName::VALUE,
44        ])
45    }
46
47    fn get_parameters(&self) -> Vec<Parameter> {
48        self.parameters.clone()
49    }
50
51    fn set_parameters(&mut self, parameters: Vec<Parameter>) {
52        self.parameters = parameters;
53    }
54}
55
56impl HasValue for PropertyMemberData {
57    fn get_value(&self) -> &Value {
58        &self.value
59    }
60
61    fn set_value(&mut self, value: Value) -> Result<(), VcardError> {
62        if !matches!(value, ValueUri(_)) {
63            return Err(VcardError::ValueNotAllowed(value.to_string(), self.name().to_string()));
64        }
65
66        if let Some(value_type) = self.has_value_type() {
67            if matches!(value, ValueUri(_)) && value_type != ValueType::URI {
68                return Err(VcardError::ValueMismatch(value.to_string(), value_type, self.name().to_string()));
69            }
70        }
71
72        self.value = value;
73
74        Ok(())
75    }
76}
77
78impl Default for PropertyMemberData {
79    fn default() -> Self {
80        Self {
81            group: None,
82            parameters: Vec::new(),
83            value: ValueUri(ValueUriData::default()),
84        }
85    }
86}
87
88impl TryFrom<(Option<String>, &str, Vec<Parameter>)> for PropertyMemberData {
89    type Error = VcardError;
90    fn try_from((group, value, parameters): (Option<String>, &str, Vec<Parameter>)) -> Result<Self, Self::Error> {
91        let mut property = Self { group, ..Self::default() };
92
93        property.add_parameters(parameters)?;
94        property.set_value(ValueUri(ValueUriData::try_from(value)?))?;
95
96        Ok(property)
97    }
98}