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
40pub trait SerializeElementAttributes: SerializeAttributes {
42 type ChildrenSerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
44
45 fn serialize_children(self) -> Result<Self::ChildrenSerializeSeq, Self::Error>;
47
48 fn end(self) -> Result<Self::Ok, Self::Error>;
50}
51
52#[must_use = "Serializers could be lazy and must be consumed to guarantee serialization. Try calling `.serialize_children()` or `.end()` on the serializer."]
54pub trait SerializeElement {
55 type Ok;
57 type Error: Error;
59
60 type ChildrenSerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
62
63 type SerializeElementAttributes: SerializeElementAttributes<Ok = Self::Ok, Error = Self::Error>;
65
66 fn include_prefix(&mut self, should_enforce: IncludePrefix) -> Result<Self::Ok, Self::Error>;
68
69 fn preferred_prefix(
71 &mut self,
72 preferred_prefix: Option<Prefix<'_>>,
73 ) -> Result<Self::Ok, Self::Error>;
74
75 fn serialize_attributes(self) -> Result<Self::SerializeElementAttributes, Self::Error>;
77
78 fn serialize_children(self) -> Result<Self::ChildrenSerializeSeq, Self::Error>;
80
81 fn end(self) -> Result<Self::Ok, Self::Error>;
83}
84
85#[must_use = "Serializers could be lazy and must be consumed to guarantee serialization. Try calling `.end()` on the serializer."]
87pub trait SerializeSeq {
88 type Ok;
90 type Error: Error;
92
93 fn serialize_element<V: Serialize>(&mut self, v: &V) -> Result<Self::Ok, Self::Error>;
95
96 fn end(self) -> Result<Self::Ok, Self::Error>;
98}
99
100pub trait Serializer: Sized {
102 type Ok;
104 type Error: Error;
106 type SerializeElement: SerializeElement<Ok = Self::Ok, Error = Self::Error>;
108 type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
110
111 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
113
114 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
116
117 fn serialize_element(
119 self,
120 name: &'_ ExpandedName<'_>,
121 ) -> Result<Self::SerializeElement, Self::Error>;
122
123 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error>;
125
126 fn serialize_decl<S: AsRef<str>>(
128 self,
129 version: S,
130 encoding: Option<S>,
131 standalone: Option<S>,
132 ) -> Result<Self::Ok, Self::Error>;
133
134 fn serialize_pi<S: AsRef<[u8]>>(self, target: S, content: S) -> Result<Self::Ok, Self::Error>;
136
137 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
139
140 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
142
143 fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
145}
146
147pub trait AttributeSerializer: Sized {
149 type Ok;
151 type Error: Error;
153 type SerializeAttribute<'a>: SerializeAttributeAccess<Ok = Self::Ok, Error = Self::Error>
155 where
156 Self: 'a;
157
158 fn serialize_attribute(
160 &mut self,
161 name: &'_ ExpandedName<'_>,
162 ) -> Result<Self::SerializeAttribute<'_>, Self::Error>;
163
164 fn serialize_none(&mut self) -> Result<Self::Ok, Self::Error>;
166}
167
168pub trait Serialize {
172 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
174}
175
176impl<T: Serialize> Serialize for &T {
177 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
178 T::serialize(*self, serializer)
179 }
180}
181
182impl<T: Serialize> Serialize for &mut T {
183 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
184 T::serialize(*self, serializer)
185 }
186}
187
188#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
190pub enum IncludePrefix {
191 Always,
193 WhenNecessaryForPreferredPrefix,
195 #[default]
197 Never,
198}
199
200pub trait SerializeAttributeAccess: Sized {
202 type Ok;
204 type Error: Error;
206
207 fn include_prefix(&mut self, should_include: IncludePrefix) -> Result<Self::Ok, Self::Error>;
209
210 fn preferred_prefix(
212 &mut self,
213 preferred_prefix: Option<Prefix<'_>>,
214 ) -> Result<Self::Ok, Self::Error>;
215
216 fn end<S: AsRef<str>>(self, value: S) -> Result<Self::Ok, Self::Error>;
218}
219
220pub trait SerializeAttribute: Sized {
224 fn serialize_attribute<S: AttributeSerializer>(&self, serializer: S)
226 -> Result<S::Ok, S::Error>;
227}
228
229pub trait SerializationGroup: Sized {
233 fn serialize_attributes<S: SerializeAttributes>(
235 &self,
236 serializer: &mut S,
237 ) -> Result<(), S::Error> {
238 let _ = serializer;
239
240 Ok(())
241 }
242
243 fn serialize_children<S: SerializeSeq>(&self, serializer: &mut S) -> Result<(), S::Error> {
245 let _ = serializer;
246
247 Ok(())
248 }
249}