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 could be lazy and must be consumed to guarantee serialization. Try calling `.serialize_children()` or `.end()` on the serializer."]
42pub trait SerializeElement: SerializeAttributes {
43 type ChildrenSerializeSeq: SerializeSeq<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::ChildrenSerializeSeq, Self::Error>;
57
58 fn end(self) -> Result<Self::Ok, Self::Error>;
60}
61
62#[must_use = "Serializers could be lazy and must be consumed to guarantee serialization. Try calling `.end()` on the serializer."]
64pub trait SerializeSeq {
65 type Ok;
67 type Error: Error;
69
70 fn serialize_element<V: Serialize>(&mut self, v: &V) -> Result<Self::Ok, Self::Error>;
72
73 fn end(self) -> Result<Self::Ok, Self::Error>;
75}
76
77pub trait Serializer: Sized {
79 type Ok;
81 type Error: Error;
83 type SerializeElement: SerializeElement<Ok = Self::Ok, Error = Self::Error>;
85 type SerializeSeq: SerializeSeq<Ok = Self::Ok, Error = Self::Error>;
87
88 fn serialize_text<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
90
91 fn serialize_cdata<S: AsRef<str>>(self, text: S) -> Result<Self::Ok, Self::Error>;
93
94 fn serialize_element(
96 self,
97 name: &'_ ExpandedName<'_>,
98 ) -> Result<Self::SerializeElement, Self::Error>;
99
100 fn serialize_seq(self) -> Result<Self::SerializeSeq, Self::Error>;
102
103 fn serialize_decl<S: AsRef<str>>(
105 self,
106 version: S,
107 encoding: Option<S>,
108 standalone: Option<S>,
109 ) -> Result<Self::Ok, Self::Error>;
110
111 fn serialize_pi<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
113
114 fn serialize_comment<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
116
117 fn serialize_doctype<S: AsRef<[u8]>>(self, text: S) -> Result<Self::Ok, Self::Error>;
119
120 fn serialize_none(self) -> Result<Self::Ok, Self::Error>;
122}
123
124pub trait AttributeSerializer: Sized {
126 type Ok;
128 type Error: Error;
130 type SerializeAttribute<'a>: SerializeAttributeAccess<Ok = Self::Ok, Error = Self::Error>
132 where
133 Self: 'a;
134
135 fn serialize_attribute(
137 &mut self,
138 name: &'_ ExpandedName<'_>,
139 ) -> Result<Self::SerializeAttribute<'_>, Self::Error>;
140
141 fn serialize_none(&mut self) -> Result<Self::Ok, Self::Error>;
143}
144
145pub trait Serialize {
149 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error>;
151}
152
153impl<T: Serialize> Serialize for &T {
154 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
155 T::serialize(*self, serializer)
156 }
157}
158
159impl<T: Serialize> Serialize for &mut T {
160 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
161 T::serialize(*self, serializer)
162 }
163}
164
165#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
167pub enum IncludePrefix {
168 Always,
170 WhenNecessaryForPreferredPrefix,
172 #[default]
174 Never,
175}
176
177pub trait SerializeAttributeAccess: Sized {
179 type Ok;
181 type Error: Error;
183
184 fn include_prefix(&mut self, should_include: IncludePrefix) -> Result<Self::Ok, Self::Error>;
186
187 fn preferred_prefix(
189 &mut self,
190 preferred_prefix: Option<Prefix<'_>>,
191 ) -> Result<Self::Ok, Self::Error>;
192
193 fn end<S: AsRef<str>>(self, value: S) -> Result<Self::Ok, Self::Error>;
195}
196
197pub trait SerializeAttribute: Sized {
201 fn serialize_attribute<S: AttributeSerializer>(&self, serializer: S)
203 -> Result<S::Ok, S::Error>;
204}
205
206pub trait SerializationGroup: Sized {
210 fn serialize_attributes<S: SerializeAttributes>(
212 &self,
213 serializer: &mut S,
214 ) -> Result<(), S::Error> {
215 let _ = serializer;
216
217 Ok(())
218 }
219
220 fn serialize_children<S: SerializeSeq>(&self, serializer: &mut S) -> Result<(), S::Error> {
222 let _ = serializer;
223
224 Ok(())
225 }
226}