rolodex/value/
mod.rs

1use std::borrow::Cow;
2use std::fmt::{Debug, Display};
3
4mod ty;
5pub use self::ty::TypeOrRaw;
6
7mod at_least;
8pub use self::at_least::AtLeastOne;
9
10use crate::types::{Address, Email, FormattedName, Gender, GeoPosition, Image, Kind, Url};
11
12#[cfg(feature = "serde")]
13pub trait PropertyValue: Debug + PartialEq + Clone + Display + serde::Serialize {}
14#[cfg(not(feature = "serde"))]
15pub trait PropertyValue: Debug + PartialEq + Clone + Display {}
16
17#[cfg(not(feature = "serde"))]
18impl<T> PropertyValue for T where T: Debug + PartialEq + Clone + Display {}
19#[cfg(feature = "serde")]
20impl<T> PropertyValue for T where T: Debug + PartialEq + Clone + Display + serde::Serialize {}
21
22#[derive(Debug, PartialEq, Clone)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24pub enum Value<'a> {
25    Begin,
26    End,
27    Source(TypeOrRaw<Url<'a>>),
28    Kind(TypeOrRaw<Kind>),
29    Xml(Cow<'a, str>),
30    Fn(Cow<'a, str>),
31    N(TypeOrRaw<FormattedName<'a>>),
32    Nickname(AtLeastOne<Cow<'a, str>>),
33    Photo(TypeOrRaw<Image<'a>>),
34    Birthday(TypeOrRaw<chrono::NaiveDate>),
35    Anniversary(TypeOrRaw<chrono::NaiveDate>),
36    Gender(TypeOrRaw<Gender<'a>>),
37    Adr(TypeOrRaw<Address<'a>>),
38    Tel(Cow<'a, str>),
39    Email(TypeOrRaw<Email<'a>>),
40    Impp(Cow<'a, str>),
41    Lang(Cow<'a, str>),
42    Timezone(Cow<'a, str>),
43    Geo(TypeOrRaw<GeoPosition>),
44    Title(Cow<'a, str>),
45    Role(Cow<'a, str>),
46    Logo(TypeOrRaw<Image<'a>>),
47    Organization(Cow<'a, str>),
48    Member(Cow<'a, str>),
49    Related(Cow<'a, str>),
50    Categories(AtLeastOne<Cow<'a, str>>),
51    Note(Cow<'a, str>),
52    ProdID(Cow<'a, str>),
53    Rev(Cow<'a, str>),
54    Sound(Cow<'a, str>),
55    Uid(Cow<'a, str>),
56    ClientPIDMap(Cow<'a, str>),
57    Url(TypeOrRaw<Url<'a>>),
58    Version(Cow<'a, str>),
59    Key(Cow<'a, str>),
60    FbUrl(Cow<'a, str>),
61    CalAdrURL(Cow<'a, str>),
62    CalURL(Cow<'a, str>),
63    Other(Cow<'a, str>, Cow<'a, str>),
64}
65
66impl<'a> Value<'a> {
67    pub fn name_raw(&self) -> &str {
68        match &self {
69            Value::Begin => "BEGIN",
70            Value::End => "END",
71            Value::Source(_) => "SOURCE",
72            Value::Kind(_) => "KIND",
73            Value::Xml(_) => "XML",
74            Value::Fn(_) => "FN",
75            Value::N(_) => "N",
76            Value::Nickname(_) => "NICKNAME",
77            Value::Photo(_) => "PHOTO",
78            Value::Birthday(_) => "BIRTHDAY",
79            Value::Anniversary(_) => "ANNIVERSARY",
80            Value::Gender(_) => "GENDER",
81            Value::Adr(_) => "ADR",
82            Value::Tel(_) => "PHONE",
83            Value::Email(_) => "EMAIL",
84            Value::Impp(_) => "IMPP",
85            Value::Lang(_) => "LANG",
86            Value::Timezone(_) => "TZ",
87            Value::Geo(_) => "GEO",
88            Value::Title(_) => "TITLE",
89            Value::Role(_) => "ROLE",
90            Value::Logo(_) => "LOGO",
91            Value::Organization(_) => "ORGANIZATION",
92            Value::Member(_) => "MEMBER",
93            Value::Related(_) => "RELATED",
94            Value::Categories(_) => "CATEGORIES",
95            Value::Note(_) => "NOTE",
96            Value::ProdID(_) => "PRODID",
97            Value::Rev(_) => "REV",
98            Value::Sound(_) => "SOUND",
99            Value::Uid(_) => "UID",
100            Value::ClientPIDMap(_) => "CLIENTPIDMAP",
101            Value::Url(_) => "URL",
102            Value::Version(_) => "VERSION",
103            Value::Key(_) => "Key",
104            Value::FbUrl(_) => "FBURL",
105            Value::CalAdrURL(_) => "CALADRURL",
106            Value::CalURL(_) => "CALURL",
107            Value::Other(name, _) => name,
108        }
109    }
110
111    pub fn name_label(&self) -> &str {
112        match self {
113            Value::Begin => "Begin",
114            Value::End => "End",
115            Value::Source(_) => "Source",
116            Value::Kind(_) => "Kind",
117            Value::Xml(_) => "Xml",
118            Value::Fn(_) => "Formatted Name",
119            Value::N(_) => "Name",
120            Value::Nickname(_) => "Nickname",
121            Value::Photo(_) => "Photo",
122            Value::Birthday(_) => "Birthday",
123            Value::Anniversary(_) => "Anniversary",
124            Value::Gender(_) => "Gender",
125            Value::Adr(_) => "Address",
126            Value::Tel(_) => "Phone",
127            Value::Email(_) => "Email",
128            Value::Impp(_) => "Impp",
129            Value::Lang(_) => "Language",
130            Value::Timezone(_) => "Timezone",
131            Value::Geo(_) => "Location",
132            Value::Title(_) => "Title",
133            Value::Role(_) => "Role",
134            Value::Logo(_) => "Logo",
135            Value::Organization(_) => "Organization",
136            Value::Member(_) => "Member",
137            Value::Related(_) => "Related",
138            Value::Categories(_) => "Categories",
139            Value::Note(_) => "Note",
140            Value::ProdID(_) => "Production Id",
141            Value::Rev(_) => "Revision",
142            Value::Sound(_) => "Sound",
143            Value::Uid(_) => "Uid",
144            Value::ClientPIDMap(_) => "Client PID Map",
145            Value::Url(_) => "Url",
146            Value::Version(_) => "Version",
147            Value::Key(_) => "Key",
148            Value::FbUrl(_) => "FBURL",
149            Value::CalAdrURL(_) => "Calendar Address URL",
150            Value::CalURL(_) => "Calendar URL",
151            Value::Other(name, _) => name,
152        }
153    }
154}