1use std::fmt::Display;
3
4use crate::{ExpandedName, Prefix};
5
6pub trait Error {
8 fn custom<T>(msg: T) -> Self
10 where
11 T: Display;
12}
13
14pub trait SerializeAttributes: Sized {
16 type Ok;
18 type Error: Error;
20
21 fn serialize_attribute<A: SerializeAttribute>(
23 &mut self,
24 a: &A,
25 ) -> Result<Self::Ok, Self::Error>;
26}
27
28impl<T: SerializeAttributes> SerializeAttributes for &mut T {
29 type Ok = T::Ok;
30 type Error = T::Error;
31
32 fn serialize_attribute<A: SerializeAttribute>(
33 &mut self,
34 a: &A,
35 ) -> Result<Self::Ok, Self::Error> {
36 SerializeAttributes::serialize_attribute(*self, a)
37 }
38}
39
40#[must_use = "serializers are lazy and must be consumed to perform serialization. Try calling `.end()` on the serializer."]
42pub trait SerializeElement: SerializeAttributes {
43 type SerializeElementChildren: SerializeElementChildren<Ok = Self::Ok, Error = Self::Error>;
45
46 fn include_prefix(&mut self, should_enforce: IncludePrefix) -> Result<Self::Ok, Self::Error>;
48
49 fn preferred_prefix(
51 &mut self,
52 preferred_prefix: Option<Prefix<'_>>,
53 ) -> Result<Self::Ok, Self::Error>;
54
55 fn serialize_children(self) -> Result<Self::SerializeElementChildren, Self::Error>;
57
58 fn end(self) -> Result<Self::Ok, Self::Error>;
60}
61
62#[must_use = "serializers are lazy and must be consumed to perform serialization. Try calling `.end()` on the serializer."]
64pub trait SerializeChildren: Sized {
65 type Ok;
67 type Error: Error;
69
70 fn serialize_child<V: Serialize>(&mut self, v: &V) -> Result<Self::Ok, Self::Error>;
72}
73
74impl<S: SerializeChildren> SerializeChildren for &mut S {
75 type Ok = S::Ok;
76 type Error = S::Error;
77 fn serialize_child<V: Serialize>(&mut self, v: &V) -> Result<Self::Ok, Self::Error> {
78 S::serialize_child(self, v)
79 }
80}
81
82#[must_use = "serializers are lazy and must be consumed to perform serialization. Try calling `.end()` on the serializer."]
84pub trait SerializeElementChildren: SerializeChildren {
85 fn end(self) -> Result<Self::Ok, Self::Error>;
87}
88
89#[must_use = "serializers are lazy and must be consumed to perform serialization. Try calling `.end()` on the serializer."]
91pub trait SerializeSeq {
92 type Ok;
94 type Error: Error;
96
97 fn serialize_element<V: Serialize>(&mut self, v: &V) -> Result<Self::Ok, Self::Error>;
99
100 fn end(self) -> Result<Self::Ok, Self::Error>;
102}
103
104pub trait Serializer: Sized {
106 type Ok;
108 type Error: Error;
110 type SerializeElement: SerializeElement<Ok = Self::Ok, Error = Self::Error>;
112 type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
114
115 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
117
118 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
120
121 fn serialize_element(
123 self,
124 name: &'_ ExpandedName<'_>,
125 ) -> Result<Self::SerializeElement, Self::Error>;
126
127 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error>;
129
130 fn serialize_decl<S: AsRef<str>>(
132 self,
133 version: S,
134 encoding: Option<S>,
135 standalone: Option<S>,
136 ) -> Result<Self::Ok, Self::Error>;
137
138 fn serialize_pi<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
140
141 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
143
144 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
146
147 fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
149}
150
151pub trait AttributeSerializer: Sized {
153 type Ok;
155 type Error: Error;
157 type SerializeAttribute<'a>: SerializeAttributeAccess<Ok = Self::Ok, Error = Self::Error>
159 where
160 Self: 'a;
161
162 fn serialize_attribute(
164 &mut self,
165 name: &'_ ExpandedName<'_>,
166 ) -> Result<Self::SerializeAttribute<'_>, Self::Error>;
167
168 fn serialize_none(&mut self) -> Result<Self::Ok, Self::Error>;
170}
171
172pub trait Serialize {
176 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
178}
179
180impl<T: Serialize> Serialize for &T {
181 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
182 T::serialize(*self, serializer)
183 }
184}
185
186impl<T: Serialize> Serialize for &mut T {
187 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
188 T::serialize(*self, serializer)
189 }
190}
191
192#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
194pub enum IncludePrefix {
195 Always,
197 WhenNecessaryForPreferredPrefix,
199 #[default]
201 Never,
202}
203
204pub trait SerializeAttributeAccess: Sized {
206 type Ok;
208 type Error: Error;
210
211 fn include_prefix(&mut self, should_include: IncludePrefix) -> Result<Self::Ok, Self::Error>;
213
214 fn preferred_prefix(
216 &mut self,
217 preferred_prefix: Option<Prefix<'_>>,
218 ) -> Result<Self::Ok, Self::Error>;
219
220 fn end<S: AsRef<str>>(self, value: S) -> Result<Self::Ok, Self::Error>;
222}
223
224pub trait SerializeAttribute: Sized {
228 fn serialize_attribute<S: AttributeSerializer>(&self, serializer: S)
230 -> Result<S::Ok, S::Error>;
231}
232
233pub trait SerializationGroup: Sized {
237 fn serialize_attributes<S: SerializeAttributes>(&self, serializer: S) -> Result<(), S::Error> {
239 let _ = serializer;
240
241 Ok(())
242 }
243
244 fn serialize_children<S: SerializeChildren>(&self, serializer: S) -> Result<(), S::Error> {
246 let _ = serializer;
247
248 Ok(())
249 }
250}