1use crate::{
2 noop::NoopDeSerializer,
3 ser::{self, Error, IncludePrefix, SerializeAttributeAccess, Unexpected},
4 ExpandedName, Prefix, Serialize, SerializeAttribute, Serializer,
5};
6
7use super::*;
8
9impl<'s> Serializer for &'s mut &mut XmlSeq<XmlValue> {
10 type Ok = ();
11 type Error = XmlValueSerializerError;
12
13 type SerializeSeq = &'s mut XmlSeq<XmlValue>;
14 type SerializeElement = &'s mut XmlElement;
15
16 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
17 self.values
18 .push_back(XmlValue::CData(XmlCData::new(text.as_ref().as_bytes())));
19 Ok(())
20 }
21
22 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
23 self.values.push_back(XmlValue::Text(XmlText::new(text)));
24 Ok(())
25 }
26
27 fn serialize_element(
28 self,
29 name: &'_ ExpandedName<'_>,
30 ) -> Result<Self::SerializeElement, Self::Error> {
31 self.values
32 .push_back(XmlValue::Element(XmlElement::new(name.into_owned())));
33
34 let XmlValue::Element(element) = self.values.back_mut().expect("just push_backed") else {
35 unreachable!()
36 };
37
38 Ok(element)
39 }
40
41 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error> {
42 Ok(self)
43 }
44
45 fn serialize_pi<S: AsRef<[u8]>>(self, target: S, content: S) -> Result<Self::Ok, Self::Error> {
46 self.values
47 .push_back(XmlValue::PI(XmlProcessingInstruction {
48 target: target.as_ref().to_vec(),
49 content: content.as_ref().to_vec(),
50 }));
51 Ok(())
52 }
53
54 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
55 self.values
56 .push_back(XmlValue::Comment(XmlComment(text.as_ref().to_vec())));
57 Ok(())
58 }
59
60 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
61 self.values.push_back(XmlValue::None);
62 Ok(())
63 }
64
65 fn serialize_decl<S: AsRef<str>>(
66 self,
67 version: S,
68 encoding: Option<S>,
69 standalone: Option<S>,
70 ) -> Result<Self::Ok, Self::Error> {
71 self.values
72 .push_back(XmlValue::Decl(XmlDecl::new(version, encoding, standalone)));
73 Ok(())
74 }
75
76 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
77 self.values
78 .push_back(XmlValue::Doctype(XmlDoctype(text.as_ref().to_vec())));
79 Ok(())
80 }
81}
82
83impl<'s> Serializer for &'s mut XmlValue {
84 type Ok = ();
85 type Error = XmlValueSerializerError;
86
87 type SerializeSeq = &'s mut XmlSeq<XmlValue>;
88 type SerializeElement = &'s mut XmlElement;
89
90 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
91 *self = XmlValue::CData(XmlCData::new(text.as_ref().as_bytes()));
92 Ok(())
93 }
94
95 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
96 *self = XmlValue::Text(XmlText::new(text));
97 Ok(())
98 }
99
100 fn serialize_element(
101 self,
102 name: &'_ ExpandedName<'_>,
103 ) -> Result<Self::SerializeElement, Self::Error> {
104 *self = XmlValue::Element(XmlElement::new(name.into_owned()));
105
106 let XmlValue::Element(element) = self else {
107 unreachable!()
108 };
109
110 Ok(element)
111 }
112
113 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error> {
114 *self = XmlValue::Seq(XmlSeq::new());
115 let XmlValue::Seq(seq) = self else {
116 unreachable!()
117 };
118 Ok(seq)
119 }
120
121 fn serialize_decl<S: AsRef<str>>(
122 self,
123 version: S,
124 encoding: Option<S>,
125 standalone: Option<S>,
126 ) -> Result<Self::Ok, Self::Error> {
127 *self = XmlValue::Decl(XmlDecl::new(version, encoding, standalone));
128 Ok(())
129 }
130
131 fn serialize_pi<S: AsRef<[u8]>>(self, target: S, content: S) -> Result<Self::Ok, Self::Error> {
132 *self = XmlValue::PI(XmlProcessingInstruction {
133 target: target.as_ref().to_vec(),
134 content: content.as_ref().to_vec(),
135 });
136 Ok(())
137 }
138
139 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
140 *self = XmlValue::Comment(XmlComment(text.as_ref().to_vec()));
141 Ok(())
142 }
143
144 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
145 *self = XmlValue::Doctype(XmlDoctype(text.as_ref().to_vec()));
146 Ok(())
147 }
148
149 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
150 *self = XmlValue::None;
151 Ok(())
152 }
153}
154
155impl<'s> Serializer for &'s mut &mut XmlSeq<XmlChild> {
156 type Ok = ();
157 type Error = XmlValueSerializerError;
158
159 type SerializeSeq = &'s mut XmlSeq<XmlChild>;
160 type SerializeElement = &'s mut XmlElement;
161
162 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
163 self.values
164 .push_back(XmlChild::CData(XmlCData::new(text.as_ref().as_bytes())));
165 Ok(())
166 }
167
168 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
169 self.values.push_back(XmlChild::Text(XmlText::new(text)));
170 Ok(())
171 }
172
173 fn serialize_element(
174 self,
175 name: &'_ ExpandedName<'_>,
176 ) -> Result<Self::SerializeElement, Self::Error> {
177 self.values
178 .push_back(XmlChild::Element(XmlElement::new(name.into_owned())));
179
180 let XmlChild::Element(element) = self.values.back_mut().expect("just push_backed") else {
181 unreachable!()
182 };
183
184 Ok(element)
185 }
186
187 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error> {
188 Ok(self)
189 }
190
191 fn serialize_pi<S: AsRef<[u8]>>(self, target: S, content: S) -> Result<Self::Ok, Self::Error> {
192 self.values
193 .push_back(XmlChild::PI(XmlProcessingInstruction {
194 target: target.as_ref().to_vec(),
195 content: content.as_ref().to_vec(),
196 }));
197 Ok(())
198 }
199
200 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
201 self.values
202 .push_back(XmlChild::Comment(XmlComment(text.as_ref().to_vec())));
203 Ok(())
204 }
205
206 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
207 self.values.push_back(XmlChild::None);
208 Ok(())
209 }
210
211 fn serialize_decl<S: AsRef<str>>(
212 self,
213 _version: S,
214 _encoding: Option<S>,
215 _standalone: Option<S>,
216 ) -> Result<Self::Ok, Self::Error> {
217 Err(Error::unexpected_serialize(Unexpected::Decl))
218 }
219
220 fn serialize_doctype<S: AsRef<[u8]>>(self, _text: S) -> Result<Self::Ok, Self::Error> {
221 Err(Error::unexpected_serialize(Unexpected::DocType))
222 }
223}
224
225impl ser::SerializeAttributes for &mut XmlElement {
226 type Ok = ();
227
228 type Error = XmlValueSerializerError;
229
230 fn serialize_attribute<A: SerializeAttribute>(
231 &mut self,
232 a: &A,
233 ) -> Result<Self::Ok, Self::Error> {
234 a.serialize_attribute(self)?;
235
236 Ok(())
237 }
238}
239
240pub struct XmlAttributeBuilder<'a> {
242 name: ExpandedNameBuf,
243 write_to: &'a mut VecDeque<XmlAttribute>,
244 should_enforce: IncludePrefix,
245 preferred_prefix: Option<PrefixBuf>,
246}
247
248impl<'a> XmlAttributeBuilder<'a> {
249 pub fn new(name: ExpandedNameBuf, write_to: &'a mut VecDeque<XmlAttribute>) -> Self {
251 Self {
252 name,
253 write_to,
254 should_enforce: IncludePrefix::default(),
255 preferred_prefix: None,
256 }
257 }
258}
259
260impl ser::AttributeSerializer for &mut &mut XmlElement {
261 type Ok = ();
262 type Error = XmlValueSerializerError;
263
264 type SerializeAttribute<'a>
265 = XmlAttributeBuilder<'a>
266 where
267 Self: 'a;
268
269 fn serialize_attribute(
270 &mut self,
271 name: &'_ ExpandedName<'_>,
272 ) -> Result<Self::SerializeAttribute<'_>, Self::Error> {
273 Ok(XmlAttributeBuilder {
274 name: name.into_owned(),
275 write_to: &mut self.attributes,
276 should_enforce: IncludePrefix::default(),
277 preferred_prefix: None,
278 })
279 }
280
281 fn serialize_none(&mut self) -> Result<Self::Ok, Self::Error> {
282 Ok(())
283 }
284}
285
286impl<'s> ser::SerializeElementAttributes for &'s mut XmlElement {
287 type ChildrenSerializeSeq = &'s mut XmlSeq<XmlChild>;
288
289 fn serialize_children(self) -> Result<Self::ChildrenSerializeSeq, Self::Error> {
290 Ok(&mut self.children)
291 }
292
293 fn end(self) -> Result<Self::Ok, Self::Error> {
294 Ok(())
295 }
296}
297
298impl<'s> ser::SerializeElement for &'s mut XmlElement {
299 type Ok = ();
300
301 type Error = XmlValueSerializerError;
302
303 type ChildrenSerializeSeq = &'s mut XmlSeq<XmlChild>;
304 type SerializeElementAttributes = &'s mut XmlElement;
305
306 fn include_prefix(&mut self, should_enforce: IncludePrefix) -> Result<Self::Ok, Self::Error> {
307 self.enforce_prefix = should_enforce;
308 Ok(())
309 }
310
311 fn preferred_prefix(
312 &mut self,
313 preferred_prefix: Option<&crate::Prefix>,
314 ) -> Result<Self::Ok, Self::Error> {
315 self.preferred_prefix = preferred_prefix.map(Prefix::to_owned);
316 Ok(())
317 }
318
319 fn serialize_children(self) -> Result<Self::ChildrenSerializeSeq, Self::Error> {
320 Ok(&mut self.children)
321 }
322
323 fn end(self) -> Result<Self::Ok, Self::Error> {
324 Ok(())
325 }
326
327 fn serialize_attributes(self) -> Result<Self::SerializeElementAttributes, Self::Error> {
328 Ok(self)
329 }
330}
331
332impl crate::ser::SerializeSeq for &mut XmlSeq<XmlValue> {
335 type Ok = ();
336
337 type Error = XmlValueSerializerError;
338
339 fn serialize_element<V: Serialize>(&mut self, v: &V) -> Result<(), Self::Error> {
340 v.serialize(self)
341 }
342
343 fn end(self) -> Result<Self::Ok, Self::Error> {
344 Ok(())
345 }
346}
347
348impl crate::ser::SerializeSeq for &mut XmlSeq<XmlChild> {
349 type Ok = ();
350
351 type Error = XmlValueSerializerError;
352
353 fn serialize_element<V: Serialize>(&mut self, v: &V) -> Result<(), Self::Error> {
354 v.serialize(self)?;
355 Ok(())
356 }
357
358 fn end(self) -> Result<Self::Ok, Self::Error> {
359 Ok(())
360 }
361}
362
363impl SerializeAttributeAccess for XmlAttributeBuilder<'_> {
364 type Ok = ();
365
366 type Error = XmlValueSerializerError;
367
368 fn include_prefix(&mut self, should_enforce: IncludePrefix) -> Result<Self::Ok, Self::Error> {
369 self.should_enforce = should_enforce;
370 Ok(())
371 }
372
373 fn preferred_prefix(
374 &mut self,
375 preferred_prefix: Option<&crate::Prefix>,
376 ) -> Result<Self::Ok, Self::Error> {
377 self.preferred_prefix = preferred_prefix.map(|p| p.to_owned());
378 Ok(())
379 }
380
381 fn end<S: Serialize>(self, value: &S) -> Result<Self::Ok, Self::Error> {
383 let mut value_container = XmlText::new("");
384 value.serialize(&mut value_container)?;
385 self.write_to.push_back(XmlAttribute {
386 name: self.name,
387 value: value_container,
388 });
389 Ok(())
390 }
391}
392
393impl crate::ser::Serializer for &mut XmlText {
394 type Ok = ();
395
396 type Error = XmlValueSerializerError;
397
398 type SerializeElement = NoopDeSerializer<Self::Ok, XmlValueSerializerError>;
399
400 type SerializeSeq = NoopDeSerializer<Self::Ok, XmlValueSerializerError>;
401
402 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
403 self.0 = text.as_ref().as_bytes().to_vec();
404
405 Ok(())
406 }
407
408 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error> {
409 let _ = text;
410
411 Err(Error::unexpected_serialize(Unexpected::CData))
412 }
413
414 fn serialize_element(
415 self,
416 name: &'_ ExpandedName<'_>,
417 ) -> Result<Self::SerializeElement, Self::Error> {
418 let _ = name;
419
420 Err(Error::unexpected_serialize(Unexpected::Element))
421 }
422
423 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error> {
424 Err(Error::unexpected_serialize(Unexpected::Seq))
425 }
426
427 fn serialize_decl<S: AsRef<str>>(
428 self,
429 version: S,
430 encoding: Option<S>,
431 standalone: Option<S>,
432 ) -> Result<Self::Ok, Self::Error> {
433 let _ = (version, encoding, standalone);
434
435 Err(Error::unexpected_serialize(Unexpected::Decl))
436 }
437
438 fn serialize_pi<S: AsRef<[u8]>>(self, target: S, content: S) -> Result<Self::Ok, Self::Error> {
439 let _ = (target, content);
440
441 Err(Error::unexpected_serialize(Unexpected::PI))
442 }
443
444 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
445 let _ = text;
446
447 Err(Error::unexpected_serialize(Unexpected::Comment))
448 }
449
450 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error> {
451 let _ = text;
452
453 Err(Error::unexpected_serialize(Unexpected::DocType))
454 }
455
456 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
457 Err(Error::unexpected_serialize(Unexpected::None))
458 }
459}