Skip to main content

vcard_parser/
traits.rs

1//! Utility traits.
2
3use crate::constants::{Cardinality, ParameterName};
4use crate::vcard::parameter::Parameter;
5use crate::vcard::value::Value;
6use crate::VcardError;
7
8pub trait HasCardinality {
9    fn cardinality(&self) -> &str;
10    fn is_multiple(&self) -> bool {
11        self.cardinality() == Cardinality::MULTIPLE
12    }
13    fn is_single(&self) -> bool {
14        self.cardinality() == Cardinality::SINGLE
15    }
16}
17
18pub trait HasGroup {
19    fn group(&self) -> &Option<String>;
20}
21
22pub trait HasName {
23    fn name(&self) -> &str;
24}
25
26pub trait HasParameters: HasName {
27    fn allowed_parameters<'a>(&self) -> Vec<&'a str>;
28    fn get_parameters(&self) -> Vec<Parameter>;
29    fn set_parameters(&mut self, parameters: Vec<Parameter>);
30    fn add_parameters(&mut self, parameters: Vec<Parameter>) -> Result<(), VcardError> {
31        for parameter in parameters {
32            self.add_parameter(parameter)?
33        }
34        Ok(())
35    }
36    fn add_parameter(&mut self, parameter: Parameter) -> Result<(), VcardError> {
37        let mut parameters = self.get_parameters();
38
39        if !self.allowed_parameters().contains(&parameter.name()) && !matches!(parameter, Parameter::ParameterXName(_)) && !self.allowed_parameters().contains(&ParameterName::ANY) {
40            return Err(VcardError::ParameterTypeNotAllowed(parameter.name().to_string(), self.name().to_string()));
41        }
42
43        parameters.push(parameter);
44        self.set_parameters(parameters);
45
46        Ok(())
47    }
48    fn remove_parameter(&mut self, index: usize) -> Result<(), VcardError> {
49        let mut parameters = self.get_parameters();
50
51        parameters.remove(index);
52        self.set_parameters(parameters);
53
54        Ok(())
55    }
56    fn has_value_type(&mut self) -> Option<String> {
57        self.get_parameters().iter().cloned().find(|p| p.name() == ParameterName::VALUE).map(|parameter| parameter.get_value().to_string())
58    }
59}
60
61pub trait HasValue {
62    fn get_value(&self) -> &Value;
63    fn set_value(&mut self, value: Value) -> Result<(), VcardError>;
64}