quick_xml/se/
text.rs
1use crate::de::TEXT_KEY;
4use crate::errors::serialize::DeError;
5use crate::se::simple_type::{SimpleSeq, SimpleTypeSerializer};
6use serde::ser::{Impossible, Serialize, Serializer};
7use serde::serde_if_integer128;
8use std::fmt::Write;
9
10macro_rules! write_primitive {
11 ($method:ident ( $ty:ty )) => {
12 #[inline]
13 fn $method(self, value: $ty) -> Result<Self::Ok, Self::Error> {
14 self.0.$method(value)
15 }
16 };
17}
18
19pub struct TextSerializer<'i, W: Write>(pub SimpleTypeSerializer<'i, W>);
27
28impl<'i, W: Write> Serializer for TextSerializer<'i, W> {
29 type Ok = W;
30 type Error = DeError;
31
32 type SerializeSeq = SimpleSeq<'i, W>;
33 type SerializeTuple = SimpleSeq<'i, W>;
34 type SerializeTupleStruct = SimpleSeq<'i, W>;
35 type SerializeTupleVariant = SimpleSeq<'i, W>;
36 type SerializeMap = Impossible<Self::Ok, Self::Error>;
37 type SerializeStruct = Impossible<Self::Ok, Self::Error>;
38 type SerializeStructVariant = Impossible<Self::Ok, Self::Error>;
39
40 write_primitive!(serialize_bool(bool));
41
42 write_primitive!(serialize_i8(i8));
43 write_primitive!(serialize_i16(i16));
44 write_primitive!(serialize_i32(i32));
45 write_primitive!(serialize_i64(i64));
46
47 write_primitive!(serialize_u8(u8));
48 write_primitive!(serialize_u16(u16));
49 write_primitive!(serialize_u32(u32));
50 write_primitive!(serialize_u64(u64));
51
52 serde_if_integer128! {
53 write_primitive!(serialize_i128(i128));
54 write_primitive!(serialize_u128(u128));
55 }
56
57 write_primitive!(serialize_f32(f32));
58 write_primitive!(serialize_f64(f64));
59
60 write_primitive!(serialize_char(char));
61 write_primitive!(serialize_str(&str));
62 write_primitive!(serialize_bytes(&[u8]));
63
64 #[inline]
65 fn serialize_none(self) -> Result<Self::Ok, Self::Error> {
66 self.0.serialize_none()
67 }
68
69 fn serialize_some<T: ?Sized + Serialize>(self, value: &T) -> Result<Self::Ok, Self::Error> {
70 value.serialize(self)
71 }
72
73 #[inline]
74 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> {
75 self.0.serialize_unit()
76 }
77
78 #[inline]
79 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> {
80 self.0.serialize_unit_struct(name)
81 }
82
83 #[inline]
84 fn serialize_unit_variant(
85 self,
86 name: &'static str,
87 variant_index: u32,
88 variant: &'static str,
89 ) -> Result<Self::Ok, Self::Error> {
90 if variant == TEXT_KEY {
91 Ok(self.0.writer)
92 } else {
93 self.0.serialize_unit_variant(name, variant_index, variant)
94 }
95 }
96
97 fn serialize_newtype_struct<T: ?Sized + Serialize>(
98 self,
99 _name: &'static str,
100 value: &T,
101 ) -> Result<Self::Ok, Self::Error> {
102 value.serialize(self)
103 }
104
105 #[inline]
106 fn serialize_newtype_variant<T: ?Sized + Serialize>(
107 self,
108 name: &'static str,
109 _variant_index: u32,
110 variant: &'static str,
111 _value: &T,
112 ) -> Result<Self::Ok, Self::Error> {
113 Err(DeError::Unsupported(
114 format!(
115 "cannot serialize enum newtype variant `{}::{}` as text content value",
116 name, variant
117 )
118 .into(),
119 ))
120 }
121
122 #[inline]
123 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> {
124 self.0.serialize_seq(len)
125 }
126
127 #[inline]
128 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> {
129 self.0.serialize_tuple(len)
130 }
131
132 #[inline]
133 fn serialize_tuple_struct(
134 self,
135 name: &'static str,
136 len: usize,
137 ) -> Result<Self::SerializeTupleStruct, Self::Error> {
138 self.0.serialize_tuple_struct(name, len)
139 }
140
141 #[inline]
142 fn serialize_tuple_variant(
143 self,
144 name: &'static str,
145 _variant_index: u32,
146 variant: &'static str,
147 _len: usize,
148 ) -> Result<Self::SerializeTupleVariant, Self::Error> {
149 Err(DeError::Unsupported(
150 format!(
151 "cannot serialize enum tuple variant `{}::{}` as text content value",
152 name, variant
153 )
154 .into(),
155 ))
156 }
157
158 #[inline]
159 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> {
160 Err(DeError::Unsupported(
161 "cannot serialize map as text content value".into(),
162 ))
163 }
164
165 #[inline]
166 fn serialize_struct(
167 self,
168 name: &'static str,
169 _len: usize,
170 ) -> Result<Self::SerializeStruct, Self::Error> {
171 Err(DeError::Unsupported(
172 format!("cannot serialize struct `{}` as text content value", name).into(),
173 ))
174 }
175
176 #[inline]
177 fn serialize_struct_variant(
178 self,
179 name: &'static str,
180 _variant_index: u32,
181 variant: &'static str,
182 _len: usize,
183 ) -> Result<Self::SerializeStructVariant, Self::Error> {
184 Err(DeError::Unsupported(
185 format!(
186 "cannot serialize enum struct variant `{}::{}` as text content value",
187 name, variant
188 )
189 .into(),
190 ))
191 }
192}