1use std::cell::RefCell;
3use std::io::BufRead;
4
5#[cfg(feature = "serde-derive")]
6extern crate serde;
7
8use crate::parser::Component;
10use crate::parser::ParserError;
11use crate::property::{Property, PropertyParser};
12
13#[derive(Debug, Clone, Default)]
14#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
15pub struct IcalCalendar {
17 pub properties: Vec<Property>,
18 pub events: Vec<IcalEvent>,
19 pub alarms: Vec<IcalAlarm>,
20 pub todos: Vec<IcalTodo>,
21 pub journals: Vec<IcalJournal>,
22 pub free_busys: Vec<IcalFreeBusy>,
23 pub timezones: Vec<IcalTimeZone>,
24}
25
26impl IcalCalendar {
27 pub fn new() -> IcalCalendar {
28 IcalCalendar {
29 properties: Vec::new(),
30 events: Vec::new(),
31 alarms: Vec::new(),
32 todos: Vec::new(),
33 journals: Vec::new(),
34 free_busys: Vec::new(),
35 timezones: Vec::new(),
36 }
37 }
38}
39
40impl Component for IcalCalendar {
41 fn add_property(&mut self, property: Property) {
42 self.properties.push(property);
43 }
44
45 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
46 self.properties.iter().find(|p| p.name == name)
47 }
48
49 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
50 self.properties.iter_mut().find(|p| p.name == name)
51 }
52
53 fn add_sub_component<B: BufRead>(
54 &mut self,
55 value: &str,
56 line_parser: &RefCell<PropertyParser<B>>,
57 ) -> Result<(), ParserError> {
58 match value {
59 "VALARM" => {
60 let mut alarm = IcalAlarm::new();
61 alarm.parse(line_parser)?;
62 self.alarms.push(alarm);
63 }
64 "VEVENT" => {
65 let mut event = IcalEvent::new();
66 event.parse(line_parser)?;
67 self.events.push(event);
68 }
69 "VTODO" => {
70 let mut todo = IcalTodo::new();
71 todo.parse(line_parser)?;
72 self.todos.push(todo);
73 }
74 "VJOURNAL" => {
75 let mut journal = IcalJournal::new();
76 journal.parse(line_parser)?;
77 self.journals.push(journal);
78 }
79 "VFREEBUSY" => {
80 let mut free_busy = IcalFreeBusy::new();
81 free_busy.parse(line_parser)?;
82 self.free_busys.push(free_busy);
83 }
84 "VTIMEZONE" => {
85 let mut timezone = IcalTimeZone::new();
86 timezone.parse(line_parser)?;
87 self.timezones.push(timezone);
88 }
89 _ => return Err(ParserError::InvalidComponent),
90 };
91
92 Ok(())
93 }
94}
95
96#[derive(Debug, Clone, Default)]
97#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
98pub struct IcalAlarm {
99 pub properties: Vec<Property>,
100}
101
102impl IcalAlarm {
103 pub fn new() -> IcalAlarm {
104 IcalAlarm {
105 properties: Vec::new(),
106 }
107 }
108}
109
110impl Component for IcalAlarm {
111 fn add_property(&mut self, property: Property) {
112 self.properties.push(property);
113 }
114
115 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
116 self.properties.iter().find(|p| p.name == name)
117 }
118
119 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
120 self.properties.iter_mut().find(|p| p.name == name)
121 }
122
123 fn add_sub_component<B: BufRead>(
124 &mut self,
125 _: &str,
126 _: &RefCell<PropertyParser<B>>,
127 ) -> Result<(), ParserError> {
128 Err(ParserError::InvalidComponent)
129 }
130}
131
132#[derive(Debug, Clone, Default)]
133#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
134pub struct IcalEvent {
135 pub properties: Vec<Property>,
136 pub alarms: Vec<IcalAlarm>,
137}
138
139impl IcalEvent {
140 pub fn new() -> IcalEvent {
141 IcalEvent {
142 properties: Vec::new(),
143 alarms: Vec::new(),
144 }
145 }
146}
147
148impl Component for IcalEvent {
149 fn add_property(&mut self, property: Property) {
150 self.properties.push(property);
151 }
152
153 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
154 self.properties.iter().find(|p| p.name == name)
155 }
156
157 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
158 self.properties.iter_mut().find(|p| p.name == name)
159 }
160
161 fn add_sub_component<B: BufRead>(
162 &mut self,
163 value: &str,
164 line_parser: &RefCell<PropertyParser<B>>,
165 ) -> Result<(), ParserError> {
166 match value {
167 "VALARM" => {
168 let mut alarm = IcalAlarm::new();
169 alarm.parse(line_parser)?;
170 self.alarms.push(alarm);
171 }
172 _ => return Err(ParserError::InvalidComponent),
173 };
174
175 Ok(())
176 }
177}
178
179#[derive(Debug, Clone, Default)]
180#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
181pub struct IcalJournal {
182 pub properties: Vec<Property>,
183}
184
185impl IcalJournal {
186 pub fn new() -> IcalJournal {
187 IcalJournal {
188 properties: Vec::new(),
189 }
190 }
191}
192
193impl Component for IcalJournal {
194 fn add_property(&mut self, property: Property) {
195 self.properties.push(property);
196 }
197
198 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
199 self.properties.iter().find(|p| p.name == name)
200 }
201
202 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
203 self.properties.iter_mut().find(|p| p.name == name)
204 }
205
206 fn add_sub_component<B: BufRead>(
207 &mut self,
208 _: &str,
209 _: &RefCell<PropertyParser<B>>,
210 ) -> Result<(), ParserError> {
211 Err(ParserError::InvalidComponent)
212 }
213}
214
215#[derive(Debug, Clone, Default)]
216#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
217pub struct IcalTodo {
218 pub properties: Vec<Property>,
219 pub alarms: Vec<IcalAlarm>,
220}
221
222impl IcalTodo {
223 pub fn new() -> IcalTodo {
224 IcalTodo {
225 properties: Vec::new(),
226 alarms: Vec::new(),
227 }
228 }
229}
230
231impl Component for IcalTodo {
232 fn add_property(&mut self, property: Property) {
233 self.properties.push(property);
234 }
235
236 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
237 self.properties.iter().find(|p| p.name == name)
238 }
239
240 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
241 self.properties.iter_mut().find(|p| p.name == name)
242 }
243
244 fn add_sub_component<B: BufRead>(
245 &mut self,
246 value: &str,
247 line_parser: &RefCell<PropertyParser<B>>,
248 ) -> Result<(), ParserError> {
249 match value {
250 "VALARM" => {
251 let mut alarm = IcalAlarm::new();
252 alarm.parse(line_parser)?;
253 self.alarms.push(alarm);
254 }
255 _ => return Err(ParserError::InvalidComponent),
256 };
257
258 Ok(())
259 }
260}
261
262#[derive(Debug, Clone, Default)]
263#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
264pub struct IcalTimeZone {
265 pub properties: Vec<Property>,
266 pub transitions: Vec<IcalTimeZoneTransition>,
267}
268
269impl IcalTimeZone {
270 pub fn new() -> IcalTimeZone {
271 IcalTimeZone {
272 properties: Vec::new(),
273 transitions: Vec::new(),
274 }
275 }
276}
277
278impl Component for IcalTimeZone {
279 fn add_property(&mut self, property: Property) {
280 self.properties.push(property);
281 }
282
283 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
284 self.properties.iter().find(|p| p.name == name)
285 }
286
287 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
288 self.properties.iter_mut().find(|p| p.name == name)
289 }
290
291 fn add_sub_component<B: BufRead>(
292 &mut self,
293 value: &str,
294 line_parser: &RefCell<PropertyParser<B>>,
295 ) -> Result<(), ParserError> {
296 use self::IcalTimeZoneTransitionType::{DAYLIGHT, STANDARD};
297
298 match value {
299 "STANDARD" => {
300 let mut transition = IcalTimeZoneTransition::new(STANDARD);
301 transition.parse(line_parser)?;
302 self.transitions.push(transition);
303 }
304 "DAYLIGHT" => {
305 let mut transition = IcalTimeZoneTransition::new(DAYLIGHT);
306 transition.parse(line_parser)?;
307 self.transitions.push(transition);
308 }
309 _ => return Err(ParserError::InvalidComponent),
310 };
311
312 Ok(())
313 }
314}
315
316#[derive(Debug, Clone, Default)]
317#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
318pub enum IcalTimeZoneTransitionType {
319 #[default]
320 STANDARD,
321 DAYLIGHT,
322}
323
324#[derive(Debug, Clone, Default)]
325#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
326pub struct IcalTimeZoneTransition {
327 pub transition: IcalTimeZoneTransitionType,
328 pub properties: Vec<Property>,
329}
330
331impl IcalTimeZoneTransition {
332 pub fn new(transition: IcalTimeZoneTransitionType) -> IcalTimeZoneTransition {
333 IcalTimeZoneTransition {
334 transition,
335 properties: Vec::new(),
336 }
337 }
338}
339
340impl Component for IcalTimeZoneTransition {
341 fn add_property(&mut self, property: Property) {
342 self.properties.push(property);
343 }
344
345 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
346 self.properties.iter().find(|p| p.name == name)
347 }
348
349 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
350 self.properties.iter_mut().find(|p| p.name == name)
351 }
352
353 fn add_sub_component<B: BufRead>(
354 &mut self,
355 _: &str,
356 _: &RefCell<PropertyParser<B>>,
357 ) -> Result<(), ParserError> {
358 Err(ParserError::InvalidComponent)
359 }
360}
361
362#[derive(Debug, Clone, Default)]
363#[cfg_attr(feature = "serde-derive", derive(serde::Serialize, serde::Deserialize))]
364pub struct IcalFreeBusy {
365 pub properties: Vec<Property>,
366}
367
368impl IcalFreeBusy {
369 pub fn new() -> IcalFreeBusy {
370 IcalFreeBusy {
371 properties: Vec::new(),
372 }
373 }
374}
375
376impl Component for IcalFreeBusy {
377 fn add_property(&mut self, property: Property) {
378 self.properties.push(property);
379 }
380
381 fn get_property<'c>(&'c self, name: &str) -> Option<&'c Property> {
382 self.properties.iter().find(|p| p.name == name)
383 }
384
385 fn get_property_mut<'c>(&'c mut self, name: &str) -> Option<&'c mut Property> {
386 self.properties.iter_mut().find(|p| p.name == name)
387 }
388
389 fn add_sub_component<B: BufRead>(
390 &mut self,
391 _: &str,
392 _: &RefCell<PropertyParser<B>>,
393 ) -> Result<(), ParserError> {
394 Err(ParserError::InvalidComponent)
395 }
396}