serde_pbx/
ser.rs

1use serde::{ser, Serialize};
2use std::fmt;
3
4// largely based on serde_json's serialiser
5
6pub fn to_string<T>(value: &T) -> Result<String>
7where
8	T: Serialize,
9{
10	let mut serializer = Serializer {
11		output: String::new(),
12		indent_level: 0,
13	};
14	value.serialize(&mut serializer)?;
15	Ok(serializer.output)
16}
17
18pub struct Serializer {
19	indent_level: i32,
20	output: String,
21}
22
23impl Serializer {
24	pub fn begin_line(&mut self) {
25		self.output += "\n";
26		for _ in 0..self.indent_level {
27			self.output += "\t";
28		}
29	}
30
31	pub fn indent(&mut self) {
32		self.indent_level += 1;
33	}
34
35	pub fn dedent(&mut self) {
36		self.indent_level -= 1;
37	}
38}
39
40#[derive(Debug)]
41pub struct Error;
42
43impl fmt::Display for Error {
44	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
45		f.write_str("Error")
46	}
47}
48
49impl std::error::Error for Error {}
50
51impl serde::ser::Error for Error {
52	fn custom<T>(_msg: T) -> Self
53	where
54		T: fmt::Display,
55	{
56		Self
57	}
58}
59
60type Result<T> = std::result::Result<T, Error>;
61
62impl<'a> ser::Serializer for &'a mut Serializer {
63	type Ok = ();
64	type Error = Error;
65	type SerializeSeq = Self;
66	type SerializeTuple = Self;
67	type SerializeTupleStruct = Self;
68	type SerializeTupleVariant = Self;
69	type SerializeMap = Self;
70	type SerializeStruct = Self;
71	type SerializeStructVariant = Self;
72
73	fn serialize_bool(self, v: bool) -> Result<()> {
74		self.output += if v { "true" } else { "false" };
75		Ok(())
76	}
77
78	fn serialize_i8(self, v: i8) -> Result<()> {
79		self.serialize_i64(i64::from(v))
80	}
81
82	fn serialize_i16(self, v: i16) -> Result<()> {
83		self.serialize_i64(i64::from(v))
84	}
85
86	fn serialize_i32(self, v: i32) -> Result<()> {
87		self.serialize_i64(i64::from(v))
88	}
89
90	fn serialize_i64(self, v: i64) -> Result<()> {
91		self.output += &v.to_string();
92		Ok(())
93	}
94
95	fn serialize_u8(self, v: u8) -> Result<()> {
96		self.serialize_u64(u64::from(v))
97	}
98
99	fn serialize_u16(self, v: u16) -> Result<()> {
100		self.serialize_u64(u64::from(v))
101	}
102
103	fn serialize_u32(self, v: u32) -> Result<()> {
104		self.serialize_u64(u64::from(v))
105	}
106
107	fn serialize_u64(self, v: u64) -> Result<()> {
108		self.output += &v.to_string();
109		Ok(())
110	}
111
112	fn serialize_f32(self, v: f32) -> Result<()> {
113		self.serialize_f64(f64::from(v))
114	}
115
116	fn serialize_f64(self, v: f64) -> Result<()> {
117		self.output += &v.to_string();
118		Ok(())
119	}
120
121	fn serialize_char(self, v: char) -> Result<()> {
122		self.serialize_str(&v.to_string())
123	}
124
125	fn serialize_str(self, v: &str) -> Result<()> {
126		self.output += "\"";
127		self.output += v;
128		self.output += "\"";
129		Ok(())
130	}
131
132	fn serialize_bytes(self, v: &[u8]) -> Result<()> {
133		use serde::ser::SerializeSeq;
134		let mut seq = self.serialize_seq(Some(v.len()))?;
135		for byte in v {
136			seq.serialize_element(byte)?;
137		}
138		seq.end()
139	}
140
141	fn serialize_none(self) -> Result<()> {
142		self.serialize_unit()
143	}
144
145	fn serialize_some<T>(self, value: &T) -> Result<()>
146	where
147		T: ?Sized + Serialize,
148	{
149		value.serialize(self)
150	}
151
152	fn serialize_unit(self) -> Result<()> {
153		self.output += "null";
154		Ok(())
155	}
156
157	fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
158		self.serialize_unit()
159	}
160
161	fn serialize_unit_variant(self, _name: &'static str, _variant_index: u32, variant: &'static str) -> Result<()> {
162		self.serialize_str(variant)
163	}
164
165	fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
166	where
167		T: ?Sized + Serialize,
168	{
169		value.serialize(self)
170	}
171
172	fn serialize_newtype_variant<T>(
173		self,
174		_name: &'static str,
175		_variant_index: u32,
176		variant: &'static str,
177		value: &T,
178	) -> Result<()>
179	where
180		T: ?Sized + Serialize,
181	{
182		self.output += "{";
183		variant.serialize(&mut *self)?;
184		self.output += ":";
185		value.serialize(&mut *self)?;
186		self.output += "}";
187		Ok(())
188	}
189
190	fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
191		self.output += "(";
192		self.indent();
193		Ok(self)
194	}
195
196	fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
197		self.serialize_seq(Some(len))
198	}
199
200	fn serialize_tuple_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeTupleStruct> {
201		self.serialize_seq(Some(len))
202	}
203
204	fn serialize_tuple_variant(
205		self,
206		_name: &'static str,
207		_variant_index: u32,
208		variant: &'static str,
209		_len: usize,
210	) -> Result<Self::SerializeTupleVariant> {
211		self.output += "{";
212		variant.serialize(&mut *self)?;
213		self.output += ":[";
214		Ok(self)
215	}
216
217	fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
218		self.output += "{";
219		self.indent();
220		Ok(self)
221	}
222
223	fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
224		self.serialize_map(Some(len))
225	}
226
227	fn serialize_struct_variant(
228		self,
229		_name: &'static str,
230		_variant_index: u32,
231		variant: &'static str,
232		_len: usize,
233	) -> Result<Self::SerializeStructVariant> {
234		self.output += "{";
235		variant.serialize(&mut *self)?;
236		self.output += ":{";
237		Ok(self)
238	}
239}
240
241impl<'a> ser::SerializeSeq for &'a mut Serializer {
242	type Ok = ();
243	type Error = Error;
244
245	fn serialize_element<T>(&mut self, value: &T) -> Result<()>
246	where
247		T: ?Sized + Serialize,
248	{
249		self.begin_line();
250		value.serialize(&mut **self)?;
251		self.output += ",";
252		Ok(())
253	}
254
255	fn end(self) -> Result<()> {
256		self.dedent();
257		self.begin_line();
258		self.output += ")";
259		Ok(())
260	}
261}
262
263impl<'a> ser::SerializeTuple for &'a mut Serializer {
264	type Ok = ();
265	type Error = Error;
266
267	fn serialize_element<T>(&mut self, value: &T) -> Result<()>
268	where
269		T: ?Sized + Serialize,
270	{
271		if !self.output.ends_with('[') {
272			self.output += ",";
273		}
274		value.serialize(&mut **self)
275	}
276
277	fn end(self) -> Result<()> {
278		self.output += "]";
279		Ok(())
280	}
281}
282
283impl<'a> ser::SerializeTupleStruct for &'a mut Serializer {
284	type Ok = ();
285	type Error = Error;
286
287	fn serialize_field<T>(&mut self, value: &T) -> Result<()>
288	where
289		T: ?Sized + Serialize,
290	{
291		if !self.output.ends_with('[') {
292			self.output += ",";
293		}
294		value.serialize(&mut **self)
295	}
296
297	fn end(self) -> Result<()> {
298		self.output += "]";
299		Ok(())
300	}
301}
302
303impl<'a> ser::SerializeTupleVariant for &'a mut Serializer {
304	type Ok = ();
305	type Error = Error;
306
307	fn serialize_field<T>(&mut self, value: &T) -> Result<()>
308	where
309		T: ?Sized + Serialize,
310	{
311		if !self.output.ends_with('[') {
312			self.output += ",";
313		}
314		value.serialize(&mut **self)
315	}
316
317	fn end(self) -> Result<()> {
318		self.output += "]}";
319		Ok(())
320	}
321}
322
323impl<'a> ser::SerializeMap for &'a mut Serializer {
324	type Ok = ();
325	type Error = Error;
326
327	fn serialize_key<T>(&mut self, key: &T) -> Result<()>
328	where
329		T: ?Sized + Serialize,
330	{
331		self.begin_line();
332		key.serialize(&mut **self)
333	}
334
335	fn serialize_value<T>(&mut self, value: &T) -> Result<()>
336	where
337		T: ?Sized + Serialize,
338	{
339		self.output += " = ";
340		value.serialize(&mut **self)?;
341		self.output += ";";
342		Ok(())
343	}
344
345	fn end(self) -> Result<()> {
346		self.dedent();
347		self.begin_line();
348		self.output += "}";
349		Ok(())
350	}
351}
352
353impl<'a> ser::SerializeStruct for &'a mut Serializer {
354	type Ok = ();
355	type Error = Error;
356
357	fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
358	where
359		T: ?Sized + Serialize,
360	{
361		self.begin_line();
362		self.output += key;
363		self.output += " = ";
364		value.serialize(&mut **self)?;
365		self.output += ";";
366		Ok(())
367	}
368
369	fn end(self) -> Result<()> {
370		self.dedent();
371		self.begin_line();
372		self.output += "}";
373		Ok(())
374	}
375}
376
377impl<'a> ser::SerializeStructVariant for &'a mut Serializer {
378	type Ok = ();
379	type Error = Error;
380
381	fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
382	where
383		T: ?Sized + Serialize,
384	{
385		if !self.output.ends_with('{') {
386			self.output += ",";
387		}
388		key.serialize(&mut **self)?;
389		self.output += ":";
390		value.serialize(&mut **self)
391	}
392
393	fn end(self) -> Result<()> {
394		self.output += "}}";
395		Ok(())
396	}
397}