| 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 = 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: &String) => 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 | |