1use std::fmt::{Debug, Display};
3
4use crate::{ExpandedName, Prefix};
5
6#[derive(Debug, thiserror::Error)]
8#[non_exhaustive]
9pub enum Unexpected {
10 #[error("text")]
12 Text,
13 #[error("cdata")]
15 CData,
16 #[error("sequence")]
18 Seq,
19 #[error("element")]
21 Element,
22 #[error("attribute")]
24 Attribute,
25 #[error("comment")]
27 Comment,
28 #[error("declaration")]
30 Decl,
31 #[error("processing instruction")]
33 PI,
34 #[error("doctype")]
36 DocType,
37 #[error("eof")]
39 Eof,
40 #[error("none")]
42 None,
43}
44
45pub trait Error {
47 fn unexpected_serialize(unexpected: Unexpected) -> Self;
49
50 fn custom<T>(msg: T) -> Self
52 where
53 T: Display;
54}
55
56pub trait SerializeAttributes: Sized {
58 type Ok;
60 type Error: Error;
62
63 fn serialize_attribute<A: SerializeAttribute>(
65 &mut self,
66 a: &A,
67 ) -> Result<Self::Ok, Self::Error>;
68}
69
70impl<T: SerializeAttributes> SerializeAttributes for &mut T {
71 type Ok = T::Ok;
72 type Error = T::Error;
73
74 fn serialize_attribute<A: SerializeAttribute>(
75 &mut self,
76 a: &A,
77 ) -> Result<Self::Ok, Self::Error> {
78 SerializeAttributes::serialize_attribute(*self, a)
79 }
80}
81
82pub trait SerializeElementAttributes: SerializeAttributes {
84 type ChildrenSerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
86
87 fn serialize_children(self) -> Result<Self::ChildrenSerializeSeq, Self::Error>;
89
90 fn end(self) -> Result<Self::Ok, Self::Error>;
92}
93
94#[must_use = "Serializers could be lazy and must be consumed to guarantee serialization. Try calling `.serialize_children()` or `.end()` on the serializer."]
96pub trait SerializeElement {
97 type Ok;
99 type Error: Error;
101
102 type ChildrenSerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
104
105 type SerializeElementAttributes: SerializeElementAttributes<Ok = Self::Ok, Error = Self::Error>;
107
108 fn include_prefix(&mut self, should_enforce: IncludePrefix) -> Result<Self::Ok, Self::Error>;
110
111 fn preferred_prefix(
113 &mut self,
114 preferred_prefix: Option<Prefix<'_>>,
115 ) -> Result<Self::Ok, Self::Error>;
116
117 fn serialize_attributes(self) -> Result<Self::SerializeElementAttributes, Self::Error>;
119
120 fn serialize_children(self) -> Result<Self::ChildrenSerializeSeq, Self::Error>;
122
123 fn end(self) -> Result<Self::Ok, Self::Error>;
125}
126
127#[must_use = "Serializers could be lazy and must be consumed to guarantee serialization. Try calling `.end()` on the serializer."]
129pub trait SerializeSeq {
130 type Ok;
132 type Error: Error;
134
135 fn serialize_element<V: Serialize>(&mut self, v: &V) -> Result<Self::Ok, Self::Error>;
137
138 fn end(self) -> Result<Self::Ok, Self::Error>;
140}
141
142pub trait Serializer: Sized {
144 type Ok;
146 type Error: Error;
148 type SerializeElement: SerializeElement<Ok = Self::Ok, Error = Self::Error>;
150 type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
152
153 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
155
156 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
158
159 fn serialize_element(
161 self,
162 name: &'_ ExpandedName<'_>,
163 ) -> Result<Self::SerializeElement, Self::Error>;
164
165 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error>;
167
168 fn serialize_decl<S: AsRef<str>>(
170 self,
171 version: S,
172 encoding: Option<S>,
173 standalone: Option<S>,
174 ) -> Result<Self::Ok, Self::Error>;
175
176 fn serialize_pi<S: AsRef<[u8]>>(self, target: S, content: S) -> Result<Self::Ok, Self::Error>;
178
179 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
181
182 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
184
185 fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
187}
188
189pub trait AttributeSerializer: Sized {
191 type Ok;
193 type Error: Error;
195 type SerializeAttribute<'a>: SerializeAttributeAccess<Ok = Self::Ok, Error = Self::Error>
197 where
198 Self: 'a;
199
200 fn serialize_attribute(
202 &mut self,
203 name: &'_ ExpandedName<'_>,
204 ) -> Result<Self::SerializeAttribute<'_>, Self::Error>;
205
206 fn serialize_none(&mut self) -> Result<Self::Ok, Self::Error>;
208}
209
210pub trait Serialize {
214 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
216}
217
218impl<T: Serialize> Serialize for &T {
219 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
220 T::serialize(*self, serializer)
221 }
222}
223
224impl<T: Serialize> Serialize for &mut T {
225 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
226 T::serialize(*self, serializer)
227 }
228}
229
230#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
232pub enum IncludePrefix {
233 Always,
235 WhenNecessaryForPreferredPrefix,
237 #[default]
239 Never,
240}
241
242pub trait SerializeAttributeAccess: Sized {
244 type Ok;
246 type Error: Error;
248
249 fn include_prefix(&mut self, should_include: IncludePrefix) -> Result<Self::Ok, Self::Error>;
251
252 fn preferred_prefix(
254 &mut self,
255 preferred_prefix: Option<Prefix<'_>>,
256 ) -> Result<Self::Ok, Self::Error>;
257
258 fn end<S: Serialize>(self, value: &S) -> Result<Self::Ok, Self::Error>;
260}
261
262pub trait SerializeAttribute: Sized {
266 fn serialize_attribute<S: AttributeSerializer>(&self, serializer: S)
268 -> Result<S::Ok, S::Error>;
269}
270
271pub trait SerializationGroup: Sized {
275 fn serialize_attributes<S: SerializeAttributes>(
277 &self,
278 serializer: &mut S,
279 ) -> Result<(), S::Error> {
280 let _ = serializer;
281
282 Ok(())
283 }
284
285 fn serialize_children<S: SerializeSeq>(&self, serializer: &mut S) -> Result<(), S::Error> {
287 let _ = serializer;
288
289 Ok(())
290 }
291}
292
293impl<T: SerializationGroup> SerializationGroup for &T {
294 fn serialize_attributes<S: SerializeAttributes>(
295 &self,
296 serializer: &mut S,
297 ) -> Result<(), S::Error> {
298 T::serialize_attributes(*self, serializer)
299 }
300
301 fn serialize_children<S: SerializeSeq>(&self, serializer: &mut S) -> Result<(), S::Error> {
302 T::serialize_children(*self, serializer)
303 }
304}
305
306impl<T: SerializationGroup> SerializationGroup for &mut T {
307 fn serialize_attributes<S: SerializeAttributes>(
308 &self,
309 serializer: &mut S,
310 ) -> Result<(), S::Error> {
311 T::serialize_attributes(*self, serializer)
312 }
313
314 fn serialize_children<S: SerializeSeq>(&self, serializer: &mut S) -> Result<(), S::Error> {
315 T::serialize_children(*self, serializer)
316 }
317}