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