1 | use serde::ser::{self, Serialize}; |
2 | use std::cell::Cell; |
3 | use std::error; |
4 | use std::fmt::{self, Display, Write}; |
5 | |
6 | /// Serialize the given data structure as a String of TOML. |
7 | /// |
8 | /// Serialization can fail if `T`'s implementation of `Serialize` decides to |
9 | /// fail, if `T` contains a map with non-string keys, or if `T` attempts to |
10 | /// serialize an unsupported datatype such as an enum, tuple, or tuple struct. |
11 | pub fn to_string<T>(value: &T) -> Result<String, crate::Error> |
12 | where |
13 | T: ?Sized + Serialize, |
14 | { |
15 | let mut dst = String::with_capacity(128); |
16 | value.serialize(&mut Serializer::new(&mut dst))?; |
17 | Ok(dst) |
18 | } |
19 | |
20 | #[derive(Debug)] |
21 | pub(crate) enum Error { |
22 | /// Indicates that a Rust type was requested to be serialized but it was not |
23 | /// supported. |
24 | /// |
25 | /// Currently the TOML format does not support serializing types such as |
26 | /// enums, tuples and tuple structs. |
27 | UnsupportedType, |
28 | |
29 | /// The key of all TOML maps must be strings, but serialization was |
30 | /// attempted where the key of a map was not a string. |
31 | KeyNotString, |
32 | |
33 | /// All values in a TOML table must be emitted before further tables are |
34 | /// emitted. If a value is emitted *after* a table then this error is |
35 | /// generated. |
36 | ValueAfterTable, |
37 | |
38 | /// None was attempted to be serialized, but it's not supported. |
39 | UnsupportedNone, |
40 | |
41 | /// A custom error which could be generated when serializing a particular |
42 | /// type. |
43 | Custom(String), |
44 | } |
45 | |
46 | struct Serializer<'a> { |
47 | dst: &'a mut String, |
48 | state: State<'a>, |
49 | } |
50 | |
51 | #[derive(Debug, Copy, Clone)] |
52 | enum ArrayState { |
53 | Started, |
54 | StartedAsATable, |
55 | } |
56 | |
57 | #[derive(Debug, Clone)] |
58 | enum State<'a> { |
59 | Table { |
60 | key: &'a str, |
61 | parent: &'a State<'a>, |
62 | first: &'a Cell<bool>, |
63 | table_emitted: &'a Cell<bool>, |
64 | }, |
65 | Array { |
66 | parent: &'a State<'a>, |
67 | first: &'a Cell<bool>, |
68 | type_: &'a Cell<Option<ArrayState>>, |
69 | len: Option<usize>, |
70 | }, |
71 | End, |
72 | } |
73 | |
74 | struct SerializeSeq<'a, 'b> { |
75 | ser: &'b mut Serializer<'a>, |
76 | first: Cell<bool>, |
77 | type_: Cell<Option<ArrayState>>, |
78 | len: Option<usize>, |
79 | } |
80 | |
81 | struct SerializeTable<'a, 'b> { |
82 | ser: &'b mut Serializer<'a>, |
83 | key: String, |
84 | first: Cell<bool>, |
85 | table_emitted: Cell<bool>, |
86 | } |
87 | |
88 | impl<'a> Serializer<'a> { |
89 | fn new(dst: &'a mut String) -> Serializer<'a> { |
90 | Serializer { |
91 | dst, |
92 | state: State::End, |
93 | } |
94 | } |
95 | |
96 | fn display<T: Display>(&mut self, t: T, type_: ArrayState) -> Result<(), Error> { |
97 | self.emit_key(type_)?; |
98 | write!(self.dst, "{}" , t).map_err(ser::Error::custom)?; |
99 | if let State::Table { .. } = self.state { |
100 | self.dst.push(' \n' ); |
101 | } |
102 | Ok(()) |
103 | } |
104 | |
105 | fn emit_key(&mut self, type_: ArrayState) -> Result<(), Error> { |
106 | self.array_type(type_); |
107 | let state = self.state.clone(); |
108 | self._emit_key(&state) |
109 | } |
110 | |
111 | // recursive implementation of `emit_key` above |
112 | fn _emit_key(&mut self, state: &State) -> Result<(), Error> { |
113 | match *state { |
114 | State::End => Ok(()), |
115 | State::Array { |
116 | parent, |
117 | first, |
118 | type_, |
119 | len, |
120 | } => { |
121 | assert!(type_.get().is_some()); |
122 | if first.get() { |
123 | self._emit_key(parent)?; |
124 | } |
125 | self.emit_array(first, len); |
126 | Ok(()) |
127 | } |
128 | State::Table { |
129 | parent, |
130 | first, |
131 | table_emitted, |
132 | key, |
133 | } => { |
134 | if table_emitted.get() { |
135 | return Err(Error::ValueAfterTable); |
136 | } |
137 | if first.get() { |
138 | self.emit_table_header(parent)?; |
139 | first.set(false); |
140 | } |
141 | self.escape_key(key)?; |
142 | self.dst.push_str(" = " ); |
143 | Ok(()) |
144 | } |
145 | } |
146 | } |
147 | |
148 | fn emit_array(&mut self, first: &Cell<bool>, _len: Option<usize>) { |
149 | if first.get() { |
150 | self.dst.push('[' ); |
151 | } else { |
152 | self.dst.push_str(", " ); |
153 | } |
154 | } |
155 | |
156 | fn array_type(&mut self, type_: ArrayState) { |
157 | let prev = match self.state { |
158 | State::Array { type_, .. } => type_, |
159 | _ => return, |
160 | }; |
161 | if prev.get().is_none() { |
162 | prev.set(Some(type_)); |
163 | } |
164 | } |
165 | |
166 | fn escape_key(&mut self, key: &str) -> Result<(), Error> { |
167 | let ok = !key.is_empty() |
168 | && key.chars().all(|c| match c { |
169 | 'a' ..='z' | 'A' ..='Z' | '0' ..='9' | '-' | '_' => true, |
170 | _ => false, |
171 | }); |
172 | if ok { |
173 | write!(self.dst, "{}" , key).map_err(ser::Error::custom)?; |
174 | } else { |
175 | self.emit_str(key)?; |
176 | } |
177 | Ok(()) |
178 | } |
179 | |
180 | fn emit_str(&mut self, value: &str) -> Result<(), Error> { |
181 | self.dst.push('"' ); |
182 | for ch in value.chars() { |
183 | match ch { |
184 | ' \u{8}' => self.dst.push_str(" \\b" ), |
185 | ' \u{9}' => self.dst.push_str(" \\t" ), |
186 | ' \u{a}' => self.dst.push_str(" \\n" ), |
187 | ' \u{c}' => self.dst.push_str(" \\f" ), |
188 | ' \u{d}' => self.dst.push_str(" \\r" ), |
189 | ' \u{22}' => self.dst.push_str(" \\\"" ), |
190 | ' \u{5c}' => self.dst.push_str(" \\\\" ), |
191 | c if c <= ' \u{1f}' || c == ' \u{7f}' => { |
192 | write!(self.dst, " \\u{:04X}" , ch as u32).map_err(ser::Error::custom)?; |
193 | } |
194 | ch => self.dst.push(ch), |
195 | } |
196 | } |
197 | self.dst.push('"' ); |
198 | Ok(()) |
199 | } |
200 | |
201 | fn emit_table_header(&mut self, state: &State) -> Result<(), Error> { |
202 | let array_of_tables = match *state { |
203 | State::End => return Ok(()), |
204 | State::Array { .. } => true, |
205 | State::Table { .. } => false, |
206 | }; |
207 | |
208 | // Unlike [..]s, we can't omit [[..]] ancestors, so be sure to emit |
209 | // table headers for them. |
210 | let mut p = state; |
211 | if let State::Array { first, parent, .. } = *state { |
212 | if first.get() { |
213 | p = parent; |
214 | } |
215 | } |
216 | while let State::Table { first, parent, .. } = *p { |
217 | p = parent; |
218 | if !first.get() { |
219 | break; |
220 | } |
221 | if let State::Array { |
222 | parent: &State::Table { .. }, |
223 | .. |
224 | } = *parent |
225 | { |
226 | self.emit_table_header(parent)?; |
227 | break; |
228 | } |
229 | } |
230 | |
231 | match *state { |
232 | State::Table { first, .. } => { |
233 | if !first.get() { |
234 | // Newline if we are a table that is not the first table in |
235 | // the document. |
236 | self.dst.push(' \n' ); |
237 | } |
238 | } |
239 | State::Array { parent, first, .. } => { |
240 | if !first.get() { |
241 | // Always newline if we are not the first item in the |
242 | // table-array |
243 | self.dst.push(' \n' ); |
244 | } else if let State::Table { first, .. } = *parent { |
245 | if !first.get() { |
246 | // Newline if we are not the first item in the document |
247 | self.dst.push(' \n' ); |
248 | } |
249 | } |
250 | } |
251 | State::End => {} |
252 | } |
253 | self.dst.push('[' ); |
254 | if array_of_tables { |
255 | self.dst.push('[' ); |
256 | } |
257 | self.emit_key_part(state)?; |
258 | if array_of_tables { |
259 | self.dst.push(']' ); |
260 | } |
261 | self.dst.push_str("] \n" ); |
262 | Ok(()) |
263 | } |
264 | |
265 | fn emit_key_part(&mut self, key: &State) -> Result<bool, Error> { |
266 | match *key { |
267 | State::Array { parent, .. } => self.emit_key_part(parent), |
268 | State::End => Ok(true), |
269 | State::Table { |
270 | key, |
271 | parent, |
272 | table_emitted, |
273 | .. |
274 | } => { |
275 | table_emitted.set(true); |
276 | let first = self.emit_key_part(parent)?; |
277 | if !first { |
278 | self.dst.push('.' ); |
279 | } |
280 | self.escape_key(key)?; |
281 | Ok(false) |
282 | } |
283 | } |
284 | } |
285 | } |
286 | |
287 | macro_rules! serialize_float { |
288 | ($this:expr, $v:expr) => {{ |
289 | $this.emit_key(ArrayState::Started)?; |
290 | match ($v.is_sign_negative(), $v.is_nan(), $v == 0.0) { |
291 | (_, true, _) => write!($this.dst, "nan" ), |
292 | (true, false, true) => write!($this.dst, "-0.0" ), |
293 | (false, false, true) => write!($this.dst, "0.0" ), |
294 | (_, false, false) => write!($this.dst, "{}" , $v).and_then(|()| { |
295 | if $v % 1.0 == 0.0 { |
296 | write!($this.dst, ".0" ) |
297 | } else { |
298 | Ok(()) |
299 | } |
300 | }), |
301 | } |
302 | .map_err(ser::Error::custom)?; |
303 | |
304 | if let State::Table { .. } = $this.state { |
305 | $this.dst.push_str(" \n" ); |
306 | } |
307 | return Ok(()); |
308 | }}; |
309 | } |
310 | |
311 | impl<'a, 'b> ser::Serializer for &'b mut Serializer<'a> { |
312 | type Ok = (); |
313 | type Error = Error; |
314 | type SerializeSeq = SerializeSeq<'a, 'b>; |
315 | type SerializeTuple = SerializeSeq<'a, 'b>; |
316 | type SerializeTupleStruct = SerializeSeq<'a, 'b>; |
317 | type SerializeTupleVariant = ser::Impossible<(), Error>; |
318 | type SerializeMap = SerializeTable<'a, 'b>; |
319 | type SerializeStruct = SerializeTable<'a, 'b>; |
320 | type SerializeStructVariant = ser::Impossible<(), Error>; |
321 | |
322 | fn serialize_bool(self, v: bool) -> Result<(), Self::Error> { |
323 | self.display(v, ArrayState::Started) |
324 | } |
325 | |
326 | fn serialize_i8(self, v: i8) -> Result<(), Self::Error> { |
327 | self.display(v, ArrayState::Started) |
328 | } |
329 | |
330 | fn serialize_i16(self, v: i16) -> Result<(), Self::Error> { |
331 | self.display(v, ArrayState::Started) |
332 | } |
333 | |
334 | fn serialize_i32(self, v: i32) -> Result<(), Self::Error> { |
335 | self.display(v, ArrayState::Started) |
336 | } |
337 | |
338 | fn serialize_i64(self, v: i64) -> Result<(), Self::Error> { |
339 | self.display(v, ArrayState::Started) |
340 | } |
341 | |
342 | fn serialize_u8(self, v: u8) -> Result<(), Self::Error> { |
343 | self.display(v, ArrayState::Started) |
344 | } |
345 | |
346 | fn serialize_u16(self, v: u16) -> Result<(), Self::Error> { |
347 | self.display(v, ArrayState::Started) |
348 | } |
349 | |
350 | fn serialize_u32(self, v: u32) -> Result<(), Self::Error> { |
351 | self.display(v, ArrayState::Started) |
352 | } |
353 | |
354 | fn serialize_u64(self, v: u64) -> Result<(), Self::Error> { |
355 | self.display(v, ArrayState::Started) |
356 | } |
357 | |
358 | fn serialize_f32(self, v: f32) -> Result<(), Self::Error> { |
359 | serialize_float!(self, v) |
360 | } |
361 | |
362 | fn serialize_f64(self, v: f64) -> Result<(), Self::Error> { |
363 | serialize_float!(self, v) |
364 | } |
365 | |
366 | fn serialize_char(self, v: char) -> Result<(), Self::Error> { |
367 | let mut buf = [0; 4]; |
368 | self.serialize_str(v.encode_utf8(&mut buf)) |
369 | } |
370 | |
371 | fn serialize_str(self, value: &str) -> Result<(), Self::Error> { |
372 | self.emit_key(ArrayState::Started)?; |
373 | self.emit_str(value)?; |
374 | if let State::Table { .. } = self.state { |
375 | self.dst.push(' \n' ); |
376 | } |
377 | Ok(()) |
378 | } |
379 | |
380 | fn serialize_bytes(self, value: &[u8]) -> Result<(), Self::Error> { |
381 | value.serialize(self) |
382 | } |
383 | |
384 | fn serialize_none(self) -> Result<(), Self::Error> { |
385 | Err(Error::UnsupportedNone) |
386 | } |
387 | |
388 | fn serialize_some<T>(self, value: &T) -> Result<(), Self::Error> |
389 | where |
390 | T: ?Sized + Serialize, |
391 | { |
392 | value.serialize(self) |
393 | } |
394 | |
395 | fn serialize_unit(self) -> Result<(), Self::Error> { |
396 | Err(Error::UnsupportedType) |
397 | } |
398 | |
399 | fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Self::Error> { |
400 | Err(Error::UnsupportedType) |
401 | } |
402 | |
403 | fn serialize_unit_variant( |
404 | self, |
405 | _name: &'static str, |
406 | _variant_index: u32, |
407 | variant: &'static str, |
408 | ) -> Result<(), Self::Error> { |
409 | self.serialize_str(variant) |
410 | } |
411 | |
412 | fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Self::Error> |
413 | where |
414 | T: ?Sized + Serialize, |
415 | { |
416 | value.serialize(self) |
417 | } |
418 | |
419 | fn serialize_newtype_variant<T>( |
420 | self, |
421 | _name: &'static str, |
422 | _variant_index: u32, |
423 | _variant: &'static str, |
424 | _value: &T, |
425 | ) -> Result<(), Self::Error> |
426 | where |
427 | T: ?Sized + Serialize, |
428 | { |
429 | Err(Error::UnsupportedType) |
430 | } |
431 | |
432 | fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { |
433 | self.array_type(ArrayState::Started); |
434 | Ok(SerializeSeq { |
435 | ser: self, |
436 | first: Cell::new(true), |
437 | type_: Cell::new(None), |
438 | len, |
439 | }) |
440 | } |
441 | |
442 | fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> { |
443 | self.serialize_seq(Some(len)) |
444 | } |
445 | |
446 | fn serialize_tuple_struct( |
447 | self, |
448 | _name: &'static str, |
449 | len: usize, |
450 | ) -> Result<Self::SerializeTupleStruct, Self::Error> { |
451 | self.serialize_seq(Some(len)) |
452 | } |
453 | |
454 | fn serialize_tuple_variant( |
455 | self, |
456 | _name: &'static str, |
457 | _variant_index: u32, |
458 | _variant: &'static str, |
459 | _len: usize, |
460 | ) -> Result<Self::SerializeTupleVariant, Self::Error> { |
461 | Err(Error::UnsupportedType) |
462 | } |
463 | |
464 | fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { |
465 | self.array_type(ArrayState::StartedAsATable); |
466 | Ok(SerializeTable { |
467 | ser: self, |
468 | key: String::new(), |
469 | first: Cell::new(true), |
470 | table_emitted: Cell::new(false), |
471 | }) |
472 | } |
473 | |
474 | fn serialize_struct( |
475 | self, |
476 | _name: &'static str, |
477 | _len: usize, |
478 | ) -> Result<Self::SerializeStruct, Self::Error> { |
479 | self.array_type(ArrayState::StartedAsATable); |
480 | Ok(SerializeTable { |
481 | ser: self, |
482 | key: String::new(), |
483 | first: Cell::new(true), |
484 | table_emitted: Cell::new(false), |
485 | }) |
486 | } |
487 | |
488 | fn serialize_struct_variant( |
489 | self, |
490 | _name: &'static str, |
491 | _variant_index: u32, |
492 | _variant: &'static str, |
493 | _len: usize, |
494 | ) -> Result<Self::SerializeStructVariant, Self::Error> { |
495 | Err(Error::UnsupportedType) |
496 | } |
497 | } |
498 | |
499 | impl<'a, 'b> ser::SerializeSeq for SerializeSeq<'a, 'b> { |
500 | type Ok = (); |
501 | type Error = Error; |
502 | |
503 | fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error> |
504 | where |
505 | T: ?Sized + Serialize, |
506 | { |
507 | value.serialize(&mut Serializer { |
508 | dst: &mut *self.ser.dst, |
509 | state: State::Array { |
510 | parent: &self.ser.state, |
511 | first: &self.first, |
512 | type_: &self.type_, |
513 | len: self.len, |
514 | }, |
515 | })?; |
516 | self.first.set(false); |
517 | Ok(()) |
518 | } |
519 | |
520 | fn end(self) -> Result<(), Error> { |
521 | match self.type_.get() { |
522 | Some(ArrayState::StartedAsATable) => return Ok(()), |
523 | Some(ArrayState::Started) => self.ser.dst.push(']' ), |
524 | None => { |
525 | assert!(self.first.get()); |
526 | self.ser.emit_key(ArrayState::Started)?; |
527 | self.ser.dst.push_str("[]" ); |
528 | } |
529 | } |
530 | if let State::Table { .. } = self.ser.state { |
531 | self.ser.dst.push(' \n' ); |
532 | } |
533 | Ok(()) |
534 | } |
535 | } |
536 | |
537 | impl<'a, 'b> ser::SerializeTuple for SerializeSeq<'a, 'b> { |
538 | type Ok = (); |
539 | type Error = Error; |
540 | |
541 | fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error> |
542 | where |
543 | T: ?Sized + Serialize, |
544 | { |
545 | ser::SerializeSeq::serialize_element(self, value) |
546 | } |
547 | |
548 | fn end(self) -> Result<(), Error> { |
549 | ser::SerializeSeq::end(self) |
550 | } |
551 | } |
552 | |
553 | impl<'a, 'b> ser::SerializeTupleStruct for SerializeSeq<'a, 'b> { |
554 | type Ok = (); |
555 | type Error = Error; |
556 | |
557 | fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error> |
558 | where |
559 | T: ?Sized + Serialize, |
560 | { |
561 | ser::SerializeSeq::serialize_element(self, value) |
562 | } |
563 | |
564 | fn end(self) -> Result<(), Error> { |
565 | ser::SerializeSeq::end(self) |
566 | } |
567 | } |
568 | |
569 | impl<'a, 'b> ser::SerializeMap for SerializeTable<'a, 'b> { |
570 | type Ok = (); |
571 | type Error = Error; |
572 | |
573 | fn serialize_key<T>(&mut self, input: &T) -> Result<(), Error> |
574 | where |
575 | T: ?Sized + Serialize, |
576 | { |
577 | self.key = input.serialize(StringExtractor)?; |
578 | Ok(()) |
579 | } |
580 | |
581 | fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error> |
582 | where |
583 | T: ?Sized + Serialize, |
584 | { |
585 | let res = value.serialize(&mut Serializer { |
586 | dst: &mut *self.ser.dst, |
587 | state: State::Table { |
588 | key: &self.key, |
589 | parent: &self.ser.state, |
590 | first: &self.first, |
591 | table_emitted: &self.table_emitted, |
592 | }, |
593 | }); |
594 | match res { |
595 | Ok(()) => self.first.set(false), |
596 | Err(Error::UnsupportedNone) => {} |
597 | Err(e) => return Err(e), |
598 | } |
599 | Ok(()) |
600 | } |
601 | |
602 | fn end(self) -> Result<(), Error> { |
603 | if self.first.get() { |
604 | let state = self.ser.state.clone(); |
605 | self.ser.emit_table_header(&state)?; |
606 | } |
607 | Ok(()) |
608 | } |
609 | } |
610 | |
611 | impl<'a, 'b> ser::SerializeStruct for SerializeTable<'a, 'b> { |
612 | type Ok = (); |
613 | type Error = Error; |
614 | |
615 | fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> |
616 | where |
617 | T: ?Sized + Serialize, |
618 | { |
619 | let res = value.serialize(&mut Serializer { |
620 | dst: &mut *self.ser.dst, |
621 | state: State::Table { |
622 | key, |
623 | parent: &self.ser.state, |
624 | first: &self.first, |
625 | table_emitted: &self.table_emitted, |
626 | }, |
627 | }); |
628 | match res { |
629 | Ok(()) => self.first.set(false), |
630 | Err(Error::UnsupportedNone) => {} |
631 | Err(e) => return Err(e), |
632 | } |
633 | Ok(()) |
634 | } |
635 | |
636 | fn end(self) -> Result<(), Error> { |
637 | if self.first.get() { |
638 | let state = self.ser.state.clone(); |
639 | self.ser.emit_table_header(&state)?; |
640 | } |
641 | Ok(()) |
642 | } |
643 | } |
644 | |
645 | struct StringExtractor; |
646 | |
647 | impl ser::Serializer for StringExtractor { |
648 | type Ok = String; |
649 | type Error = Error; |
650 | type SerializeSeq = ser::Impossible<String, Error>; |
651 | type SerializeTuple = ser::Impossible<String, Error>; |
652 | type SerializeTupleStruct = ser::Impossible<String, Error>; |
653 | type SerializeTupleVariant = ser::Impossible<String, Error>; |
654 | type SerializeMap = ser::Impossible<String, Error>; |
655 | type SerializeStruct = ser::Impossible<String, Error>; |
656 | type SerializeStructVariant = ser::Impossible<String, Error>; |
657 | |
658 | fn serialize_bool(self, _v: bool) -> Result<String, Self::Error> { |
659 | Err(Error::KeyNotString) |
660 | } |
661 | |
662 | fn serialize_i8(self, _v: i8) -> Result<String, Self::Error> { |
663 | Err(Error::KeyNotString) |
664 | } |
665 | |
666 | fn serialize_i16(self, _v: i16) -> Result<String, Self::Error> { |
667 | Err(Error::KeyNotString) |
668 | } |
669 | |
670 | fn serialize_i32(self, _v: i32) -> Result<String, Self::Error> { |
671 | Err(Error::KeyNotString) |
672 | } |
673 | |
674 | fn serialize_i64(self, _v: i64) -> Result<String, Self::Error> { |
675 | Err(Error::KeyNotString) |
676 | } |
677 | |
678 | fn serialize_u8(self, _v: u8) -> Result<String, Self::Error> { |
679 | Err(Error::KeyNotString) |
680 | } |
681 | |
682 | fn serialize_u16(self, _v: u16) -> Result<String, Self::Error> { |
683 | Err(Error::KeyNotString) |
684 | } |
685 | |
686 | fn serialize_u32(self, _v: u32) -> Result<String, Self::Error> { |
687 | Err(Error::KeyNotString) |
688 | } |
689 | |
690 | fn serialize_u64(self, _v: u64) -> Result<String, Self::Error> { |
691 | Err(Error::KeyNotString) |
692 | } |
693 | |
694 | fn serialize_f32(self, _v: f32) -> Result<String, Self::Error> { |
695 | Err(Error::KeyNotString) |
696 | } |
697 | |
698 | fn serialize_f64(self, _v: f64) -> Result<String, Self::Error> { |
699 | Err(Error::KeyNotString) |
700 | } |
701 | |
702 | fn serialize_char(self, _v: char) -> Result<String, Self::Error> { |
703 | Err(Error::KeyNotString) |
704 | } |
705 | |
706 | fn serialize_str(self, value: &str) -> Result<String, Self::Error> { |
707 | Ok(value.to_string()) |
708 | } |
709 | |
710 | fn serialize_bytes(self, _value: &[u8]) -> Result<String, Self::Error> { |
711 | Err(Error::KeyNotString) |
712 | } |
713 | |
714 | fn serialize_none(self) -> Result<String, Self::Error> { |
715 | Err(Error::KeyNotString) |
716 | } |
717 | |
718 | fn serialize_some<T>(self, _value: &T) -> Result<String, Self::Error> |
719 | where |
720 | T: ?Sized + Serialize, |
721 | { |
722 | Err(Error::KeyNotString) |
723 | } |
724 | |
725 | fn serialize_unit(self) -> Result<String, Self::Error> { |
726 | Err(Error::KeyNotString) |
727 | } |
728 | |
729 | fn serialize_unit_struct(self, _name: &'static str) -> Result<String, Self::Error> { |
730 | Err(Error::KeyNotString) |
731 | } |
732 | |
733 | fn serialize_unit_variant( |
734 | self, |
735 | _name: &'static str, |
736 | _variant_index: u32, |
737 | _variant: &'static str, |
738 | ) -> Result<String, Self::Error> { |
739 | Err(Error::KeyNotString) |
740 | } |
741 | |
742 | fn serialize_newtype_struct<T>( |
743 | self, |
744 | _name: &'static str, |
745 | value: &T, |
746 | ) -> Result<String, Self::Error> |
747 | where |
748 | T: ?Sized + Serialize, |
749 | { |
750 | value.serialize(self) |
751 | } |
752 | |
753 | fn serialize_newtype_variant<T>( |
754 | self, |
755 | _name: &'static str, |
756 | _variant_index: u32, |
757 | _variant: &'static str, |
758 | _value: &T, |
759 | ) -> Result<String, Self::Error> |
760 | where |
761 | T: ?Sized + Serialize, |
762 | { |
763 | Err(Error::KeyNotString) |
764 | } |
765 | |
766 | fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { |
767 | Err(Error::KeyNotString) |
768 | } |
769 | |
770 | fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> { |
771 | Err(Error::KeyNotString) |
772 | } |
773 | |
774 | fn serialize_tuple_struct( |
775 | self, |
776 | _name: &'static str, |
777 | _len: usize, |
778 | ) -> Result<Self::SerializeTupleStruct, Self::Error> { |
779 | Err(Error::KeyNotString) |
780 | } |
781 | |
782 | fn serialize_tuple_variant( |
783 | self, |
784 | _name: &'static str, |
785 | _variant_index: u32, |
786 | _variant: &'static str, |
787 | _len: usize, |
788 | ) -> Result<Self::SerializeTupleVariant, Self::Error> { |
789 | Err(Error::KeyNotString) |
790 | } |
791 | |
792 | fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { |
793 | Err(Error::KeyNotString) |
794 | } |
795 | |
796 | fn serialize_struct( |
797 | self, |
798 | _name: &'static str, |
799 | _len: usize, |
800 | ) -> Result<Self::SerializeStruct, Self::Error> { |
801 | Err(Error::KeyNotString) |
802 | } |
803 | |
804 | fn serialize_struct_variant( |
805 | self, |
806 | _name: &'static str, |
807 | _variant_index: u32, |
808 | _variant: &'static str, |
809 | _len: usize, |
810 | ) -> Result<Self::SerializeStructVariant, Self::Error> { |
811 | Err(Error::KeyNotString) |
812 | } |
813 | } |
814 | |
815 | impl Display for Error { |
816 | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
817 | match *self { |
818 | Error::UnsupportedType => "unsupported Rust type" .fmt(f), |
819 | Error::KeyNotString => "map key was not a string" .fmt(f), |
820 | Error::ValueAfterTable => "values must be emitted before tables" .fmt(f), |
821 | Error::UnsupportedNone => "unsupported None value" .fmt(f), |
822 | Error::Custom(ref s) => s.fmt(f), |
823 | } |
824 | } |
825 | } |
826 | |
827 | impl error::Error for Error {} |
828 | |
829 | impl ser::Error for Error { |
830 | fn custom<T: Display>(msg: T) -> Error { |
831 | Error::Custom(msg.to_string()) |
832 | } |
833 | } |
834 | |