1
use crate::error::AetoliaResult;
2
use crate::model::property::RecurrenceDateTimesPropertyValue;
3
use crate::serialize::WriteModel;
4
use std::io::Write;
5

            
6
impl WriteModel for crate::model::property::ComponentProperty {
7
672
    fn write_model<W: Write>(&self, writer: &mut W) -> AetoliaResult<()> {
8
        use crate::model::property::ComponentProperty;
9

            
10
672
        match self {
11
30
            ComponentProperty::DateTimeStamp(property) => {
12
30
                writer.write_all(b"DTSTAMP")?;
13
30
                property.params.as_slice().write_model(writer)?;
14
30
                writer.write_all(b":")?;
15
30
                property.value.write_model(writer)?;
16
            }
17
28
            ComponentProperty::UniqueIdentifier(property) => {
18
28
                writer.write_all(b"UID")?;
19
28
                property.params.as_slice().write_model(writer)?;
20
28
                writer.write_all(b":")?;
21
28
                property.value.write_model(writer)?;
22
            }
23
60
            ComponentProperty::DateTimeStart(property) => {
24
60
                writer.write_all(b"DTSTART")?;
25
60
                property.params.as_slice().write_model(writer)?;
26
60
                writer.write_all(b":")?;
27
60
                property.value.write_model(writer)?;
28
            }
29
14
            ComponentProperty::Classification(property) => {
30
14
                writer.write_all(b"CLASS")?;
31
14
                property.params.as_slice().write_model(writer)?;
32
14
                writer.write_all(b":")?;
33
14
                property.value.write_model(writer)?;
34
            }
35
6
            ComponentProperty::DateTimeCreated(property) => {
36
6
                writer.write_all(b"CREATED")?;
37
6
                property.params.as_slice().write_model(writer)?;
38
6
                writer.write_all(b":")?;
39
6
                property.value.write_model(writer)?;
40
            }
41
18
            ComponentProperty::Description(property) => {
42
18
                writer.write_all(b"DESCRIPTION")?;
43
18
                property.params.as_slice().write_model(writer)?;
44
18
                writer.write_all(b":")?;
45
18
                property.value.write_model(writer)?;
46
            }
47
4
            ComponentProperty::GeographicPosition(property) => {
48
4
                writer.write_all(b"GEO")?;
49
4
                property.params.as_slice().write_model(writer)?;
50
4
                writer.write_all(b":")?;
51
4
                write!(writer, "{};", property.value.latitude)?;
52
4
                write!(writer, "{}", property.value.longitude)?;
53
            }
54
18
            ComponentProperty::LastModified(property) => {
55
18
                writer.write_all(b"LAST-MODIFIED")?;
56
18
                property.params.as_slice().write_model(writer)?;
57
18
                writer.write_all(b":")?;
58
18
                property.value.write_model(writer)?;
59
            }
60
4
            ComponentProperty::Location(property) => {
61
4
                writer.write_all(b"LOCATION")?;
62
4
                property.params.as_slice().write_model(writer)?;
63
4
                writer.write_all(b":")?;
64
4
                property.value.write_model(writer)?;
65
            }
66
14
            ComponentProperty::Organizer(property) => {
67
14
                writer.write_all(b"ORGANIZER")?;
68
14
                property.params.as_slice().write_model(writer)?;
69
14
                writer.write_all(b":")?;
70
14
                writer.write_all(property.value.as_bytes())?;
71
            }
72
6
            ComponentProperty::Priority(property) => {
73
6
                writer.write_all(b"PRIORITY")?;
74
6
                property.params.as_slice().write_model(writer)?;
75
6
                writer.write_all(b":")?;
76
6
                write!(writer, "{}", property.value)?;
77
            }
78
6
            ComponentProperty::Sequence(property) => {
79
6
                writer.write_all(b"SEQUENCE")?;
80
6
                property.params.as_slice().write_model(writer)?;
81
6
                writer.write_all(b":")?;
82
6
                write!(writer, "{}", property.value)?;
83
            }
84
24
            ComponentProperty::Summary(property) => {
85
24
                writer.write_all(b"SUMMARY")?;
86
24
                property.params.as_slice().write_model(writer)?;
87
24
                writer.write_all(b":")?;
88
24
                property.value.write_model(writer)?;
89
            }
90
8
            ComponentProperty::TimeTransparency(property) => {
91
8
                writer.write_all(b"TRANSP")?;
92
8
                property.params.as_slice().write_model(writer)?;
93
8
                writer.write_all(b":")?;
94
8
                property.value.write_model(writer)?;
95
            }
96
8
            ComponentProperty::RequestStatus(property) => {
97
8
                writer.write_all(b"REQUEST-STATUS")?;
98
8
                property.params.as_slice().write_model(writer)?;
99
8
                writer.write_all(b":")?;
100
8
                if let Some(code) = property.value.status_code.first() {
101
8
                    write!(writer, "{}", code)?;
102
                }
103
8
                for code in property.value.status_code.iter().skip(1) {
104
8
                    write!(writer, ".{}", code)?;
105
                }
106
8
                writer.write_all(b";")?;
107
8
                writer.write_all(property.value.description.as_bytes())?;
108
8
                if let Some(exception_data) = &property.value.exception_data {
109
8
                    writer.write_all(b";")?;
110
8
                    writer.write_all(exception_data.as_bytes())?;
111
                }
112
            }
113
12
            ComponentProperty::Url(property) => {
114
12
                writer.write_all(b"URL")?;
115
12
                property.params.as_slice().write_model(writer)?;
116
12
                writer.write_all(b":")?;
117
12
                writer.write_all(property.value.as_bytes())?;
118
            }
119
6
            ComponentProperty::RecurrenceId(property) => {
120
6
                writer.write_all(b"RECURRENCE-ID")?;
121
6
                property.params.as_slice().write_model(writer)?;
122
6
                writer.write_all(b":")?;
123
6
                property.value.write_model(writer)?;
124
            }
125
38
            ComponentProperty::RecurrenceRule(property) => {
126
38
                writer.write_all(b"RRULE")?;
127
38
                property.params.as_slice().write_model(writer)?;
128
38
                writer.write_all(b":")?;
129
38
                property.value.write_model(writer)?;
130
            }
131
14
            ComponentProperty::DateTimeEnd(property) => {
132
14
                writer.write_all(b"DTEND")?;
133
14
                property.params.as_slice().write_model(writer)?;
134
14
                writer.write_all(b":")?;
135
14
                property.value.write_model(writer)?;
136
            }
137
14
            ComponentProperty::Duration(property) => {
138
14
                writer.write_all(b"DURATION")?;
139
14
                property.params.as_slice().write_model(writer)?;
140
14
                writer.write_all(b":")?;
141
14
                property.value.write_model(writer)?;
142
            }
143
14
            ComponentProperty::Attach(property) => {
144
14
                writer.write_all(b"ATTACH")?;
145
14
                property.params.as_slice().write_model(writer)?;
146
14
                writer.write_all(b":")?;
147
14
                writer.write_all(property.value.as_bytes())?;
148
            }
149
16
            ComponentProperty::Attendee(property) => {
150
16
                writer.write_all(b"ATTENDEE")?;
151
16
                property.params.as_slice().write_model(writer)?;
152
16
                writer.write_all(b":")?;
153
16
                writer.write_all(property.value.as_bytes())?;
154
            }
155
14
            ComponentProperty::Categories(property) => {
156
14
                writer.write_all(b"CATEGORIES")?;
157
14
                property.params.as_slice().write_model(writer)?;
158
14
                writer.write_all(b":")?;
159
14
                if let Some(category) = property.value.first() {
160
14
                    category.write_model(writer)?;
161
                }
162
22
                for category in property.value.iter().skip(1) {
163
22
                    writer.write_all(b",")?;
164
22
                    category.write_model(writer)?;
165
                }
166
            }
167
14
            ComponentProperty::Comment(property) => {
168
14
                writer.write_all(b"COMMENT")?;
169
14
                property.params.as_slice().write_model(writer)?;
170
14
                writer.write_all(b":")?;
171
14
                property.value.write_model(writer)?;
172
            }
173
8
            ComponentProperty::Contact(property) => {
174
8
                writer.write_all(b"CONTACT")?;
175
8
                property.params.as_slice().write_model(writer)?;
176
8
                writer.write_all(b":")?;
177
8
                property.value.write_model(writer)?;
178
            }
179
6
            ComponentProperty::ExceptionDateTimes(property) => {
180
6
                writer.write_all(b"EXDATE")?;
181
6
                property.params.as_slice().write_model(writer)?;
182
6
                writer.write_all(b":")?;
183
6
                if let Some(dt) = property.value.first() {
184
6
                    dt.write_model(writer)?;
185
                }
186
6
                for dt in property.value.iter().skip(1) {
187
6
                    writer.write_all(b",")?;
188
6
                    dt.write_model(writer)?;
189
                }
190
            }
191
10
            ComponentProperty::Status(property) => {
192
10
                writer.write_all(b"STATUS")?;
193
10
                property.params.as_slice().write_model(writer)?;
194
10
                writer.write_all(b":")?;
195
10
                property.value.write_model(writer)?;
196
            }
197
6
            ComponentProperty::RelatedTo(property) => {
198
6
                writer.write_all(b"RELATED-TO")?;
199
6
                property.params.as_slice().write_model(writer)?;
200
6
                writer.write_all(b":")?;
201
6
                property.value.write_model(writer)?;
202
            }
203
4
            ComponentProperty::Resources(property) => {
204
4
                writer.write_all(b"RESOURCES")?;
205
4
                property.params.as_slice().write_model(writer)?;
206
4
                writer.write_all(b":")?;
207
4
                if let Some(resource) = property.value.first() {
208
4
                    resource.write_model(writer)?;
209
                }
210
8
                for resource in property.value.iter().skip(1) {
211
8
                    writer.write_all(b",")?;
212
8
                    resource.write_model(writer)?;
213
                }
214
            }
215
12
            ComponentProperty::RecurrenceDateTimes(property) => {
216
12
                writer.write_all(b"RDATE")?;
217
12
                property.params.as_slice().write_model(writer)?;
218
12
                writer.write_all(b":")?;
219
12
                match &property.value {
220
12
                    RecurrenceDateTimesPropertyValue::DateTimes(date_times) => {
221
12
                        if let Some(dt) = date_times.first() {
222
12
                            dt.write_model(writer)?;
223
                        }
224
12
                        for dt in date_times.iter().skip(1) {
225
10
                            writer.write_all(b",")?;
226
10
                            dt.write_model(writer)?;
227
                        }
228
                    }
229
                    RecurrenceDateTimesPropertyValue::Periods(periods) => {
230
                        if let Some(period) = periods.first() {
231
                            period.write_model(writer)?;
232
                        }
233
                        for period in periods.iter().skip(1) {
234
                            writer.write_all(b",")?;
235
                            period.write_model(writer)?;
236
                        }
237
                    }
238
                }
239
            }
240
4
            ComponentProperty::DateTimeCompleted(property) => {
241
4
                writer.write_all(b"COMPLETED")?;
242
4
                property.params.as_slice().write_model(writer)?;
243
4
                writer.write_all(b":")?;
244
4
                property.value.write_model(writer)?;
245
            }
246
2
            ComponentProperty::PercentComplete(property) => {
247
2
                writer.write_all(b"PERCENT-COMPLETE")?;
248
2
                property.params.as_slice().write_model(writer)?;
249
2
                writer.write_all(b":")?;
250
2
                write!(writer, "{}", property.value)?;
251
            }
252
4
            ComponentProperty::DateTimeDue(property) => {
253
4
                writer.write_all(b"DUE")?;
254
4
                property.params.as_slice().write_model(writer)?;
255
4
                writer.write_all(b":")?;
256
4
                property.value.write_model(writer)?;
257
            }
258
10
            ComponentProperty::FreeBusyTime(property) => {
259
10
                writer.write_all(b"FREEBUSY")?;
260
10
                property.params.as_slice().write_model(writer)?;
261
10
                writer.write_all(b":")?;
262
10
                if let Some(period) = property.value.first() {
263
10
                    period.write_model(writer)?;
264
                }
265
10
                for period in property.value.iter().skip(1) {
266
6
                    writer.write_all(b",")?;
267
6
                    period.write_model(writer)?;
268
                }
269
            }
270
12
            ComponentProperty::TimeZoneId(property) => {
271
12
                writer.write_all(b"TZID")?;
272
12
                property.params.as_slice().write_model(writer)?;
273
12
                writer.write_all(b":")?;
274
12
                if property.value.unique_registry_id {
275
                    writer.write_all(b"/")?;
276
12
                }
277
12
                writer.write_all(property.value.id.as_bytes())?;
278
            }
279
4
            ComponentProperty::TimeZoneUrl(property) => {
280
4
                writer.write_all(b"TZURL")?;
281
4
                property.params.as_slice().write_model(writer)?;
282
4
                writer.write_all(b":")?;
283
4
                writer.write_all(property.value.as_bytes())?;
284
            }
285
36
            ComponentProperty::TimeZoneOffsetTo(property) => {
286
36
                writer.write_all(b"TZOFFSETTO")?;
287
36
                property.params.as_slice().write_model(writer)?;
288
36
                writer.write_all(b":")?;
289
36
                property.value.write_model(writer)?;
290
            }
291
36
            ComponentProperty::TimeZoneOffsetFrom(property) => {
292
36
                writer.write_all(b"TZOFFSETFROM")?;
293
36
                property.params.as_slice().write_model(writer)?;
294
36
                writer.write_all(b":")?;
295
36
                property.value.write_model(writer)?;
296
            }
297
36
            ComponentProperty::TimeZoneName(property) => {
298
36
                writer.write_all(b"TZNAME")?;
299
36
                property.params.as_slice().write_model(writer)?;
300
36
                writer.write_all(b":")?;
301
36
                property.value.write_model(writer)?;
302
            }
303
14
            ComponentProperty::Action(property) => {
304
14
                writer.write_all(b"ACTION")?;
305
14
                property.params.as_slice().write_model(writer)?;
306
14
                writer.write_all(b":")?;
307
14
                property.value.write_model(writer)?;
308
            }
309
14
            ComponentProperty::Trigger(property) => {
310
14
                writer.write_all(b"TRIGGER")?;
311
14
                match &property.value {
312
8
                    crate::model::property::TriggerValue::Relative(duration) => {
313
8
                        property.params.as_slice().write_model(writer)?;
314
8
                        writer.write_all(b":")?;
315
8
                        duration.write_model(writer)?;
316
                    }
317
6
                    crate::model::property::TriggerValue::Absolute(date_time) => {
318
6
                        property.params.as_slice().write_model(writer)?;
319
6
                        writer.write_all(b":")?;
320
6
                        date_time.write_model(writer)?;
321
                    }
322
                }
323
            }
324
12
            ComponentProperty::Repeat(property) => {
325
12
                writer.write_all(b"REPEAT")?;
326
12
                property.params.as_slice().write_model(writer)?;
327
12
                writer.write_all(b":")?;
328
12
                write!(writer, "{}", property.value)?;
329
            }
330
26
            ComponentProperty::IanaProperty(property) => {
331
26
                writer.write_all(property.name.as_bytes())?;
332
26
                property.params.as_slice().write_model(writer)?;
333
26
                writer.write_all(b":")?;
334
26
                writer.write_all(property.value.as_bytes())?;
335
            }
336
26
            ComponentProperty::XProperty(property) => {
337
26
                writer.write_all(property.name.as_bytes())?;
338
26
                property.params.as_slice().write_model(writer)?;
339
26
                writer.write_all(b":")?;
340
26
                writer.write_all(property.value.as_bytes())?;
341
            }
342
        }
343

            
344
672
        Ok(())
345
672
    }
346
}
347

            
348
impl WriteModel for &[crate::model::param::Param] {
349
680
    fn write_model<W: Write>(&self, writer: &mut W) -> AetoliaResult<()> {
350
1172
        for param in self.iter() {
351
836
            writer.write_all(b";")?;
352
836
            param.write_model(writer)?;
353
        }
354

            
355
680
        Ok(())
356
680
    }
357
}