1use 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(¶meter.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}