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}