1 //! Definition of a TOML [value][Value] 2 3 use std::collections::{BTreeMap, HashMap}; 4 use std::fmt; 5 use std::hash::Hash; 6 use std::mem::discriminant; 7 use std::ops; 8 use std::vec; 9 10 use serde::de; 11 use serde::de::IntoDeserializer; 12 use serde::ser; 13 14 use toml_datetime::__unstable as datetime; 15 pub use toml_datetime::{Date, Datetime, DatetimeParseError, Offset, Time}; 16 17 /// Type representing a TOML array, payload of the `Value::Array` variant 18 pub type Array = Vec<Value>; 19 20 #[doc(no_inline)] 21 pub use crate::Table; 22 23 /// Representation of a TOML value. 24 #[derive(PartialEq, Clone, Debug)] 25 pub enum Value { 26 /// Represents a TOML string 27 String(String), 28 /// Represents a TOML integer 29 Integer(i64), 30 /// Represents a TOML float 31 Float(f64), 32 /// Represents a TOML boolean 33 Boolean(bool), 34 /// Represents a TOML datetime 35 Datetime(Datetime), 36 /// Represents a TOML array 37 Array(Array), 38 /// Represents a TOML table 39 Table(Table), 40 } 41 42 impl Value { 43 /// Convert a `T` into `toml::Value` which is an enum that can represent 44 /// any valid TOML data. 45 /// 46 /// This conversion can fail if `T`'s implementation of `Serialize` decides to 47 /// fail, or if `T` contains a map with non-string keys. try_from<T>(value: T) -> Result<Value, crate::ser::Error> where T: ser::Serialize,48 pub fn try_from<T>(value: T) -> Result<Value, crate::ser::Error> 49 where 50 T: ser::Serialize, 51 { 52 value.serialize(ValueSerializer) 53 } 54 55 /// Interpret a `toml::Value` as an instance of type `T`. 56 /// 57 /// This conversion can fail if the structure of the `Value` does not match the 58 /// structure expected by `T`, for example if `T` is a struct type but the 59 /// `Value` contains something other than a TOML table. It can also fail if the 60 /// structure is correct but `T`'s implementation of `Deserialize` decides that 61 /// something is wrong with the data, for example required struct fields are 62 /// missing from the TOML map or some number is too big to fit in the expected 63 /// primitive type. try_into<'de, T>(self) -> Result<T, crate::de::Error> where T: de::Deserialize<'de>,64 pub fn try_into<'de, T>(self) -> Result<T, crate::de::Error> 65 where 66 T: de::Deserialize<'de>, 67 { 68 de::Deserialize::deserialize(self) 69 } 70 71 /// Index into a TOML array or map. A string index can be used to access a 72 /// value in a map, and a usize index can be used to access an element of an 73 /// array. 74 /// 75 /// Returns `None` if the type of `self` does not match the type of the 76 /// index, for example if the index is a string and `self` is an array or a 77 /// number. Also returns `None` if the given key does not exist in the map 78 /// or the given index is not within the bounds of the array. get<I: Index>(&self, index: I) -> Option<&Value>79 pub fn get<I: Index>(&self, index: I) -> Option<&Value> { 80 index.index(self) 81 } 82 83 /// Mutably index into a TOML array or map. A string index can be used to 84 /// access a value in a map, and a usize index can be used to access an 85 /// element of an array. 86 /// 87 /// Returns `None` if the type of `self` does not match the type of the 88 /// index, for example if the index is a string and `self` is an array or a 89 /// number. Also returns `None` if the given key does not exist in the map 90 /// or the given index is not within the bounds of the array. get_mut<I: Index>(&mut self, index: I) -> Option<&mut Value>91 pub fn get_mut<I: Index>(&mut self, index: I) -> Option<&mut Value> { 92 index.index_mut(self) 93 } 94 95 /// Extracts the integer value if it is an integer. as_integer(&self) -> Option<i64>96 pub fn as_integer(&self) -> Option<i64> { 97 match *self { 98 Value::Integer(i) => Some(i), 99 _ => None, 100 } 101 } 102 103 /// Tests whether this value is an integer. is_integer(&self) -> bool104 pub fn is_integer(&self) -> bool { 105 self.as_integer().is_some() 106 } 107 108 /// Extracts the float value if it is a float. as_float(&self) -> Option<f64>109 pub fn as_float(&self) -> Option<f64> { 110 match *self { 111 Value::Float(f) => Some(f), 112 _ => None, 113 } 114 } 115 116 /// Tests whether this value is a float. is_float(&self) -> bool117 pub fn is_float(&self) -> bool { 118 self.as_float().is_some() 119 } 120 121 /// Extracts the boolean value if it is a boolean. as_bool(&self) -> Option<bool>122 pub fn as_bool(&self) -> Option<bool> { 123 match *self { 124 Value::Boolean(b) => Some(b), 125 _ => None, 126 } 127 } 128 129 /// Tests whether this value is a boolean. is_bool(&self) -> bool130 pub fn is_bool(&self) -> bool { 131 self.as_bool().is_some() 132 } 133 134 /// Extracts the string of this value if it is a string. as_str(&self) -> Option<&str>135 pub fn as_str(&self) -> Option<&str> { 136 match *self { 137 Value::String(ref s) => Some(&**s), 138 _ => None, 139 } 140 } 141 142 /// Tests if this value is a string. is_str(&self) -> bool143 pub fn is_str(&self) -> bool { 144 self.as_str().is_some() 145 } 146 147 /// Extracts the datetime value if it is a datetime. 148 /// 149 /// Note that a parsed TOML value will only contain ISO 8601 dates. An 150 /// example date is: 151 /// 152 /// ```notrust 153 /// 1979-05-27T07:32:00Z 154 /// ``` as_datetime(&self) -> Option<&Datetime>155 pub fn as_datetime(&self) -> Option<&Datetime> { 156 match *self { 157 Value::Datetime(ref s) => Some(s), 158 _ => None, 159 } 160 } 161 162 /// Tests whether this value is a datetime. is_datetime(&self) -> bool163 pub fn is_datetime(&self) -> bool { 164 self.as_datetime().is_some() 165 } 166 167 /// Extracts the array value if it is an array. as_array(&self) -> Option<&Vec<Value>>168 pub fn as_array(&self) -> Option<&Vec<Value>> { 169 match *self { 170 Value::Array(ref s) => Some(s), 171 _ => None, 172 } 173 } 174 175 /// Extracts the array value if it is an array. as_array_mut(&mut self) -> Option<&mut Vec<Value>>176 pub fn as_array_mut(&mut self) -> Option<&mut Vec<Value>> { 177 match *self { 178 Value::Array(ref mut s) => Some(s), 179 _ => None, 180 } 181 } 182 183 /// Tests whether this value is an array. is_array(&self) -> bool184 pub fn is_array(&self) -> bool { 185 self.as_array().is_some() 186 } 187 188 /// Extracts the table value if it is a table. as_table(&self) -> Option<&Table>189 pub fn as_table(&self) -> Option<&Table> { 190 match *self { 191 Value::Table(ref s) => Some(s), 192 _ => None, 193 } 194 } 195 196 /// Extracts the table value if it is a table. as_table_mut(&mut self) -> Option<&mut Table>197 pub fn as_table_mut(&mut self) -> Option<&mut Table> { 198 match *self { 199 Value::Table(ref mut s) => Some(s), 200 _ => None, 201 } 202 } 203 204 /// Tests whether this value is a table. is_table(&self) -> bool205 pub fn is_table(&self) -> bool { 206 self.as_table().is_some() 207 } 208 209 /// Tests whether this and another value have the same type. same_type(&self, other: &Value) -> bool210 pub fn same_type(&self, other: &Value) -> bool { 211 discriminant(self) == discriminant(other) 212 } 213 214 /// Returns a human-readable representation of the type of this value. type_str(&self) -> &'static str215 pub fn type_str(&self) -> &'static str { 216 match *self { 217 Value::String(..) => "string", 218 Value::Integer(..) => "integer", 219 Value::Float(..) => "float", 220 Value::Boolean(..) => "boolean", 221 Value::Datetime(..) => "datetime", 222 Value::Array(..) => "array", 223 Value::Table(..) => "table", 224 } 225 } 226 } 227 228 impl<I> ops::Index<I> for Value 229 where 230 I: Index, 231 { 232 type Output = Value; 233 index(&self, index: I) -> &Value234 fn index(&self, index: I) -> &Value { 235 self.get(index).expect("index not found") 236 } 237 } 238 239 impl<I> ops::IndexMut<I> for Value 240 where 241 I: Index, 242 { index_mut(&mut self, index: I) -> &mut Value243 fn index_mut(&mut self, index: I) -> &mut Value { 244 self.get_mut(index).expect("index not found") 245 } 246 } 247 248 impl<'a> From<&'a str> for Value { 249 #[inline] from(val: &'a str) -> Value250 fn from(val: &'a str) -> Value { 251 Value::String(val.to_string()) 252 } 253 } 254 255 impl<V: Into<Value>> From<Vec<V>> for Value { from(val: Vec<V>) -> Value256 fn from(val: Vec<V>) -> Value { 257 Value::Array(val.into_iter().map(|v| v.into()).collect()) 258 } 259 } 260 261 impl<S: Into<String>, V: Into<Value>> From<BTreeMap<S, V>> for Value { from(val: BTreeMap<S, V>) -> Value262 fn from(val: BTreeMap<S, V>) -> Value { 263 let table = val.into_iter().map(|(s, v)| (s.into(), v.into())).collect(); 264 265 Value::Table(table) 266 } 267 } 268 269 impl<S: Into<String> + Hash + Eq, V: Into<Value>> From<HashMap<S, V>> for Value { from(val: HashMap<S, V>) -> Value270 fn from(val: HashMap<S, V>) -> Value { 271 let table = val.into_iter().map(|(s, v)| (s.into(), v.into())).collect(); 272 273 Value::Table(table) 274 } 275 } 276 277 macro_rules! impl_into_value { 278 ($variant:ident : $T:ty) => { 279 impl From<$T> for Value { 280 #[inline] 281 fn from(val: $T) -> Value { 282 Value::$variant(val.into()) 283 } 284 } 285 }; 286 } 287 288 impl_into_value!(String: String); 289 impl_into_value!(Integer: i64); 290 impl_into_value!(Integer: i32); 291 impl_into_value!(Integer: i8); 292 impl_into_value!(Integer: u8); 293 impl_into_value!(Integer: u32); 294 impl_into_value!(Float: f64); 295 impl_into_value!(Float: f32); 296 impl_into_value!(Boolean: bool); 297 impl_into_value!(Datetime: Datetime); 298 impl_into_value!(Table: Table); 299 300 /// Types that can be used to index a `toml::Value` 301 /// 302 /// Currently this is implemented for `usize` to index arrays and `str` to index 303 /// tables. 304 /// 305 /// This trait is sealed and not intended for implementation outside of the 306 /// `toml` crate. 307 pub trait Index: Sealed { 308 #[doc(hidden)] index<'a>(&self, val: &'a Value) -> Option<&'a Value>309 fn index<'a>(&self, val: &'a Value) -> Option<&'a Value>; 310 #[doc(hidden)] index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>311 fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>; 312 } 313 314 /// An implementation detail that should not be implemented, this will change in 315 /// the future and break code otherwise. 316 #[doc(hidden)] 317 pub trait Sealed {} 318 impl Sealed for usize {} 319 impl Sealed for str {} 320 impl Sealed for String {} 321 impl<'a, T: Sealed + ?Sized> Sealed for &'a T {} 322 323 impl Index for usize { index<'a>(&self, val: &'a Value) -> Option<&'a Value>324 fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> { 325 match *val { 326 Value::Array(ref a) => a.get(*self), 327 _ => None, 328 } 329 } 330 index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>331 fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> { 332 match *val { 333 Value::Array(ref mut a) => a.get_mut(*self), 334 _ => None, 335 } 336 } 337 } 338 339 impl Index for str { index<'a>(&self, val: &'a Value) -> Option<&'a Value>340 fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> { 341 match *val { 342 Value::Table(ref a) => a.get(self), 343 _ => None, 344 } 345 } 346 index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>347 fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> { 348 match *val { 349 Value::Table(ref mut a) => a.get_mut(self), 350 _ => None, 351 } 352 } 353 } 354 355 impl Index for String { index<'a>(&self, val: &'a Value) -> Option<&'a Value>356 fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> { 357 self[..].index(val) 358 } 359 index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>360 fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> { 361 self[..].index_mut(val) 362 } 363 } 364 365 impl<'s, T: ?Sized> Index for &'s T 366 where 367 T: Index, 368 { index<'a>(&self, val: &'a Value) -> Option<&'a Value>369 fn index<'a>(&self, val: &'a Value) -> Option<&'a Value> { 370 (**self).index(val) 371 } 372 index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value>373 fn index_mut<'a>(&self, val: &'a mut Value) -> Option<&'a mut Value> { 374 (**self).index_mut(val) 375 } 376 } 377 378 #[cfg(feature = "display")] 379 impl fmt::Display for Value { fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result380 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 381 use serde::Serialize as _; 382 383 let mut output = String::new(); 384 let serializer = crate::ser::ValueSerializer::new(&mut output); 385 self.serialize(serializer).unwrap(); 386 output.fmt(f) 387 } 388 } 389 390 #[cfg(feature = "parse")] 391 impl std::str::FromStr for Value { 392 type Err = crate::de::Error; from_str(s: &str) -> Result<Value, Self::Err>393 fn from_str(s: &str) -> Result<Value, Self::Err> { 394 crate::from_str(s) 395 } 396 } 397 398 impl ser::Serialize for Value { serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: ser::Serializer,399 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> 400 where 401 S: ser::Serializer, 402 { 403 use serde::ser::SerializeMap; 404 405 match *self { 406 Value::String(ref s) => serializer.serialize_str(s), 407 Value::Integer(i) => serializer.serialize_i64(i), 408 Value::Float(f) => serializer.serialize_f64(f), 409 Value::Boolean(b) => serializer.serialize_bool(b), 410 Value::Datetime(ref s) => s.serialize(serializer), 411 Value::Array(ref a) => a.serialize(serializer), 412 Value::Table(ref t) => { 413 let mut map = serializer.serialize_map(Some(t.len()))?; 414 // Be sure to visit non-tables first (and also non 415 // array-of-tables) as all keys must be emitted first. 416 for (k, v) in t { 417 if !v.is_table() && !v.is_array() 418 || (v 419 .as_array() 420 .map(|a| !a.iter().any(|v| v.is_table())) 421 .unwrap_or(false)) 422 { 423 map.serialize_entry(k, v)?; 424 } 425 } 426 for (k, v) in t { 427 if v.as_array() 428 .map(|a| a.iter().any(|v| v.is_table())) 429 .unwrap_or(false) 430 { 431 map.serialize_entry(k, v)?; 432 } 433 } 434 for (k, v) in t { 435 if v.is_table() { 436 map.serialize_entry(k, v)?; 437 } 438 } 439 map.end() 440 } 441 } 442 } 443 } 444 445 impl<'de> de::Deserialize<'de> for Value { deserialize<D>(deserializer: D) -> Result<Value, D::Error> where D: de::Deserializer<'de>,446 fn deserialize<D>(deserializer: D) -> Result<Value, D::Error> 447 where 448 D: de::Deserializer<'de>, 449 { 450 struct ValueVisitor; 451 452 impl<'de> de::Visitor<'de> for ValueVisitor { 453 type Value = Value; 454 455 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { 456 formatter.write_str("any valid TOML value") 457 } 458 459 fn visit_bool<E>(self, value: bool) -> Result<Value, E> { 460 Ok(Value::Boolean(value)) 461 } 462 463 fn visit_i64<E>(self, value: i64) -> Result<Value, E> { 464 Ok(Value::Integer(value)) 465 } 466 467 fn visit_u64<E: de::Error>(self, value: u64) -> Result<Value, E> { 468 if value <= i64::max_value() as u64 { 469 Ok(Value::Integer(value as i64)) 470 } else { 471 Err(de::Error::custom("u64 value was too large")) 472 } 473 } 474 475 fn visit_u32<E>(self, value: u32) -> Result<Value, E> { 476 Ok(Value::Integer(value.into())) 477 } 478 479 fn visit_i32<E>(self, value: i32) -> Result<Value, E> { 480 Ok(Value::Integer(value.into())) 481 } 482 483 fn visit_f64<E>(self, value: f64) -> Result<Value, E> { 484 Ok(Value::Float(value)) 485 } 486 487 fn visit_str<E>(self, value: &str) -> Result<Value, E> { 488 Ok(Value::String(value.into())) 489 } 490 491 fn visit_string<E>(self, value: String) -> Result<Value, E> { 492 Ok(Value::String(value)) 493 } 494 495 fn visit_some<D>(self, deserializer: D) -> Result<Value, D::Error> 496 where 497 D: de::Deserializer<'de>, 498 { 499 de::Deserialize::deserialize(deserializer) 500 } 501 502 fn visit_seq<V>(self, mut visitor: V) -> Result<Value, V::Error> 503 where 504 V: de::SeqAccess<'de>, 505 { 506 let mut vec = Vec::new(); 507 while let Some(elem) = visitor.next_element()? { 508 vec.push(elem); 509 } 510 Ok(Value::Array(vec)) 511 } 512 513 fn visit_map<V>(self, mut visitor: V) -> Result<Value, V::Error> 514 where 515 V: de::MapAccess<'de>, 516 { 517 let mut key = String::new(); 518 let datetime = visitor.next_key_seed(DatetimeOrTable { key: &mut key })?; 519 match datetime { 520 Some(true) => { 521 let date: datetime::DatetimeFromString = visitor.next_value()?; 522 return Ok(Value::Datetime(date.value)); 523 } 524 None => return Ok(Value::Table(Table::new())), 525 Some(false) => {} 526 } 527 let mut map = Table::new(); 528 map.insert(key, visitor.next_value()?); 529 while let Some(key) = visitor.next_key::<String>()? { 530 if let crate::map::Entry::Vacant(vacant) = map.entry(&key) { 531 vacant.insert(visitor.next_value()?); 532 } else { 533 let msg = format!("duplicate key: `{}`", key); 534 return Err(de::Error::custom(msg)); 535 } 536 } 537 Ok(Value::Table(map)) 538 } 539 } 540 541 deserializer.deserialize_any(ValueVisitor) 542 } 543 } 544 545 // This is wrapped by `Table` and any trait methods implemented here need to be wrapped there. 546 impl<'de> de::Deserializer<'de> for Value { 547 type Error = crate::de::Error; 548 deserialize_any<V>(self, visitor: V) -> Result<V::Value, crate::de::Error> where V: de::Visitor<'de>,549 fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, crate::de::Error> 550 where 551 V: de::Visitor<'de>, 552 { 553 match self { 554 Value::Boolean(v) => visitor.visit_bool(v), 555 Value::Integer(n) => visitor.visit_i64(n), 556 Value::Float(n) => visitor.visit_f64(n), 557 Value::String(v) => visitor.visit_string(v), 558 Value::Datetime(v) => visitor.visit_string(v.to_string()), 559 Value::Array(v) => { 560 let len = v.len(); 561 let mut deserializer = SeqDeserializer::new(v); 562 let seq = visitor.visit_seq(&mut deserializer)?; 563 let remaining = deserializer.iter.len(); 564 if remaining == 0 { 565 Ok(seq) 566 } else { 567 Err(de::Error::invalid_length(len, &"fewer elements in array")) 568 } 569 } 570 Value::Table(v) => { 571 let len = v.len(); 572 let mut deserializer = MapDeserializer::new(v); 573 let map = visitor.visit_map(&mut deserializer)?; 574 let remaining = deserializer.iter.len(); 575 if remaining == 0 { 576 Ok(map) 577 } else { 578 Err(de::Error::invalid_length(len, &"fewer elements in map")) 579 } 580 } 581 } 582 } 583 584 #[inline] deserialize_enum<V>( self, _name: &'static str, _variants: &'static [&'static str], visitor: V, ) -> Result<V::Value, crate::de::Error> where V: de::Visitor<'de>,585 fn deserialize_enum<V>( 586 self, 587 _name: &'static str, 588 _variants: &'static [&'static str], 589 visitor: V, 590 ) -> Result<V::Value, crate::de::Error> 591 where 592 V: de::Visitor<'de>, 593 { 594 match self { 595 Value::String(variant) => visitor.visit_enum(variant.into_deserializer()), 596 Value::Table(variant) => { 597 use de::Error; 598 if variant.is_empty() { 599 Err(crate::de::Error::custom( 600 "wanted exactly 1 element, found 0 elements", 601 )) 602 } else if variant.len() != 1 { 603 Err(crate::de::Error::custom( 604 "wanted exactly 1 element, more than 1 element", 605 )) 606 } else { 607 let deserializer = MapDeserializer::new(variant); 608 visitor.visit_enum(deserializer) 609 } 610 } 611 _ => Err(de::Error::invalid_type( 612 de::Unexpected::UnitVariant, 613 &"string only", 614 )), 615 } 616 } 617 618 // `None` is interpreted as a missing field so be sure to implement `Some` 619 // as a present field. deserialize_option<V>(self, visitor: V) -> Result<V::Value, crate::de::Error> where V: de::Visitor<'de>,620 fn deserialize_option<V>(self, visitor: V) -> Result<V::Value, crate::de::Error> 621 where 622 V: de::Visitor<'de>, 623 { 624 visitor.visit_some(self) 625 } 626 deserialize_newtype_struct<V>( self, _name: &'static str, visitor: V, ) -> Result<V::Value, crate::de::Error> where V: de::Visitor<'de>,627 fn deserialize_newtype_struct<V>( 628 self, 629 _name: &'static str, 630 visitor: V, 631 ) -> Result<V::Value, crate::de::Error> 632 where 633 V: de::Visitor<'de>, 634 { 635 visitor.visit_newtype_struct(self) 636 } 637 638 serde::forward_to_deserialize_any! { 639 bool u8 u16 u32 u64 i8 i16 i32 i64 f32 f64 char str string unit seq 640 bytes byte_buf map unit_struct tuple_struct struct 641 tuple ignored_any identifier 642 } 643 } 644 645 struct SeqDeserializer { 646 iter: vec::IntoIter<Value>, 647 } 648 649 impl SeqDeserializer { new(vec: Vec<Value>) -> Self650 fn new(vec: Vec<Value>) -> Self { 651 SeqDeserializer { 652 iter: vec.into_iter(), 653 } 654 } 655 } 656 657 impl<'de> de::SeqAccess<'de> for SeqDeserializer { 658 type Error = crate::de::Error; 659 next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error> where T: de::DeserializeSeed<'de>,660 fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error> 661 where 662 T: de::DeserializeSeed<'de>, 663 { 664 match self.iter.next() { 665 Some(value) => seed.deserialize(value).map(Some), 666 None => Ok(None), 667 } 668 } 669 size_hint(&self) -> Option<usize>670 fn size_hint(&self) -> Option<usize> { 671 match self.iter.size_hint() { 672 (lower, Some(upper)) if lower == upper => Some(upper), 673 _ => None, 674 } 675 } 676 } 677 678 struct MapDeserializer { 679 iter: <Table as IntoIterator>::IntoIter, 680 value: Option<(String, Value)>, 681 } 682 683 impl MapDeserializer { new(map: Table) -> Self684 fn new(map: Table) -> Self { 685 MapDeserializer { 686 iter: map.into_iter(), 687 value: None, 688 } 689 } 690 } 691 692 impl<'de> de::MapAccess<'de> for MapDeserializer { 693 type Error = crate::de::Error; 694 next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error> where T: de::DeserializeSeed<'de>,695 fn next_key_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>, crate::de::Error> 696 where 697 T: de::DeserializeSeed<'de>, 698 { 699 match self.iter.next() { 700 Some((key, value)) => { 701 self.value = Some((key.clone(), value)); 702 seed.deserialize(Value::String(key)).map(Some) 703 } 704 None => Ok(None), 705 } 706 } 707 next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, crate::de::Error> where T: de::DeserializeSeed<'de>,708 fn next_value_seed<T>(&mut self, seed: T) -> Result<T::Value, crate::de::Error> 709 where 710 T: de::DeserializeSeed<'de>, 711 { 712 let (key, res) = match self.value.take() { 713 Some((key, value)) => (key, seed.deserialize(value)), 714 None => return Err(de::Error::custom("value is missing")), 715 }; 716 res.map_err(|mut error| { 717 error.add_key(key); 718 error 719 }) 720 } 721 size_hint(&self) -> Option<usize>722 fn size_hint(&self) -> Option<usize> { 723 match self.iter.size_hint() { 724 (lower, Some(upper)) if lower == upper => Some(upper), 725 _ => None, 726 } 727 } 728 } 729 730 impl<'de> de::EnumAccess<'de> for MapDeserializer { 731 type Error = crate::de::Error; 732 type Variant = MapEnumDeserializer; 733 variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> where V: serde::de::DeserializeSeed<'de>,734 fn variant_seed<V>(mut self, seed: V) -> Result<(V::Value, Self::Variant), Self::Error> 735 where 736 V: serde::de::DeserializeSeed<'de>, 737 { 738 use de::Error; 739 let (key, value) = match self.iter.next() { 740 Some(pair) => pair, 741 None => { 742 return Err(Error::custom( 743 "expected table with exactly 1 entry, found empty table", 744 )); 745 } 746 }; 747 748 let val = seed.deserialize(key.into_deserializer())?; 749 750 let variant = MapEnumDeserializer::new(value); 751 752 Ok((val, variant)) 753 } 754 } 755 756 /// Deserializes table values into enum variants. 757 pub(crate) struct MapEnumDeserializer { 758 value: Value, 759 } 760 761 impl MapEnumDeserializer { new(value: Value) -> Self762 pub(crate) fn new(value: Value) -> Self { 763 MapEnumDeserializer { value } 764 } 765 } 766 767 impl<'de> serde::de::VariantAccess<'de> for MapEnumDeserializer { 768 type Error = crate::de::Error; 769 unit_variant(self) -> Result<(), Self::Error>770 fn unit_variant(self) -> Result<(), Self::Error> { 771 use de::Error; 772 match self.value { 773 Value::Array(values) => { 774 if values.is_empty() { 775 Ok(()) 776 } else { 777 Err(Error::custom("expected empty array")) 778 } 779 } 780 Value::Table(values) => { 781 if values.is_empty() { 782 Ok(()) 783 } else { 784 Err(Error::custom("expected empty table")) 785 } 786 } 787 e => Err(Error::custom(format!( 788 "expected table, found {}", 789 e.type_str() 790 ))), 791 } 792 } 793 newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error> where T: serde::de::DeserializeSeed<'de>,794 fn newtype_variant_seed<T>(self, seed: T) -> Result<T::Value, Self::Error> 795 where 796 T: serde::de::DeserializeSeed<'de>, 797 { 798 seed.deserialize(self.value.into_deserializer()) 799 } 800 tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> where V: serde::de::Visitor<'de>,801 fn tuple_variant<V>(self, len: usize, visitor: V) -> Result<V::Value, Self::Error> 802 where 803 V: serde::de::Visitor<'de>, 804 { 805 use de::Error; 806 match self.value { 807 Value::Array(values) => { 808 if values.len() == len { 809 serde::de::Deserializer::deserialize_seq(values.into_deserializer(), visitor) 810 } else { 811 Err(Error::custom(format!("expected tuple with length {}", len))) 812 } 813 } 814 Value::Table(values) => { 815 let tuple_values: Result<Vec<_>, _> = values 816 .into_iter() 817 .enumerate() 818 .map(|(index, (key, value))| match key.parse::<usize>() { 819 Ok(key_index) if key_index == index => Ok(value), 820 Ok(_) | Err(_) => Err(Error::custom(format!( 821 "expected table key `{}`, but was `{}`", 822 index, key 823 ))), 824 }) 825 .collect(); 826 let tuple_values = tuple_values?; 827 828 if tuple_values.len() == len { 829 serde::de::Deserializer::deserialize_seq( 830 tuple_values.into_deserializer(), 831 visitor, 832 ) 833 } else { 834 Err(Error::custom(format!("expected tuple with length {}", len))) 835 } 836 } 837 e => Err(Error::custom(format!( 838 "expected table, found {}", 839 e.type_str() 840 ))), 841 } 842 } 843 struct_variant<V>( self, fields: &'static [&'static str], visitor: V, ) -> Result<V::Value, Self::Error> where V: serde::de::Visitor<'de>,844 fn struct_variant<V>( 845 self, 846 fields: &'static [&'static str], 847 visitor: V, 848 ) -> Result<V::Value, Self::Error> 849 where 850 V: serde::de::Visitor<'de>, 851 { 852 serde::de::Deserializer::deserialize_struct( 853 self.value.into_deserializer(), 854 "", // TODO: this should be the variant name 855 fields, 856 visitor, 857 ) 858 } 859 } 860 861 impl<'de> de::IntoDeserializer<'de, crate::de::Error> for Value { 862 type Deserializer = Self; 863 into_deserializer(self) -> Self864 fn into_deserializer(self) -> Self { 865 self 866 } 867 } 868 869 struct ValueSerializer; 870 871 impl ser::Serializer for ValueSerializer { 872 type Ok = Value; 873 type Error = crate::ser::Error; 874 875 type SerializeSeq = ValueSerializeVec; 876 type SerializeTuple = ValueSerializeVec; 877 type SerializeTupleStruct = ValueSerializeVec; 878 type SerializeTupleVariant = ValueSerializeTupleVariant; 879 type SerializeMap = ValueSerializeMap; 880 type SerializeStruct = ValueSerializeMap; 881 type SerializeStructVariant = ValueSerializeStructVariant; 882 serialize_bool(self, value: bool) -> Result<Value, crate::ser::Error>883 fn serialize_bool(self, value: bool) -> Result<Value, crate::ser::Error> { 884 Ok(Value::Boolean(value)) 885 } 886 serialize_i8(self, value: i8) -> Result<Value, crate::ser::Error>887 fn serialize_i8(self, value: i8) -> Result<Value, crate::ser::Error> { 888 self.serialize_i64(value.into()) 889 } 890 serialize_i16(self, value: i16) -> Result<Value, crate::ser::Error>891 fn serialize_i16(self, value: i16) -> Result<Value, crate::ser::Error> { 892 self.serialize_i64(value.into()) 893 } 894 serialize_i32(self, value: i32) -> Result<Value, crate::ser::Error>895 fn serialize_i32(self, value: i32) -> Result<Value, crate::ser::Error> { 896 self.serialize_i64(value.into()) 897 } 898 serialize_i64(self, value: i64) -> Result<Value, crate::ser::Error>899 fn serialize_i64(self, value: i64) -> Result<Value, crate::ser::Error> { 900 Ok(Value::Integer(value)) 901 } 902 serialize_u8(self, value: u8) -> Result<Value, crate::ser::Error>903 fn serialize_u8(self, value: u8) -> Result<Value, crate::ser::Error> { 904 self.serialize_i64(value.into()) 905 } 906 serialize_u16(self, value: u16) -> Result<Value, crate::ser::Error>907 fn serialize_u16(self, value: u16) -> Result<Value, crate::ser::Error> { 908 self.serialize_i64(value.into()) 909 } 910 serialize_u32(self, value: u32) -> Result<Value, crate::ser::Error>911 fn serialize_u32(self, value: u32) -> Result<Value, crate::ser::Error> { 912 self.serialize_i64(value.into()) 913 } 914 serialize_u64(self, value: u64) -> Result<Value, crate::ser::Error>915 fn serialize_u64(self, value: u64) -> Result<Value, crate::ser::Error> { 916 if value <= i64::max_value() as u64 { 917 self.serialize_i64(value as i64) 918 } else { 919 Err(ser::Error::custom("u64 value was too large")) 920 } 921 } 922 serialize_f32(self, value: f32) -> Result<Value, crate::ser::Error>923 fn serialize_f32(self, value: f32) -> Result<Value, crate::ser::Error> { 924 self.serialize_f64(value as f64) 925 } 926 serialize_f64(self, mut value: f64) -> Result<Value, crate::ser::Error>927 fn serialize_f64(self, mut value: f64) -> Result<Value, crate::ser::Error> { 928 // Discard sign of NaN. See ValueSerializer::serialize_f64. 929 if value.is_nan() { 930 value = value.copysign(1.0); 931 } 932 Ok(Value::Float(value)) 933 } 934 serialize_char(self, value: char) -> Result<Value, crate::ser::Error>935 fn serialize_char(self, value: char) -> Result<Value, crate::ser::Error> { 936 let mut s = String::new(); 937 s.push(value); 938 self.serialize_str(&s) 939 } 940 serialize_str(self, value: &str) -> Result<Value, crate::ser::Error>941 fn serialize_str(self, value: &str) -> Result<Value, crate::ser::Error> { 942 Ok(Value::String(value.to_owned())) 943 } 944 serialize_bytes(self, value: &[u8]) -> Result<Value, crate::ser::Error>945 fn serialize_bytes(self, value: &[u8]) -> Result<Value, crate::ser::Error> { 946 let vec = value.iter().map(|&b| Value::Integer(b.into())).collect(); 947 Ok(Value::Array(vec)) 948 } 949 serialize_unit(self) -> Result<Value, crate::ser::Error>950 fn serialize_unit(self) -> Result<Value, crate::ser::Error> { 951 Err(crate::ser::Error::unsupported_type(Some("unit"))) 952 } 953 serialize_unit_struct(self, name: &'static str) -> Result<Value, crate::ser::Error>954 fn serialize_unit_struct(self, name: &'static str) -> Result<Value, crate::ser::Error> { 955 Err(crate::ser::Error::unsupported_type(Some(name))) 956 } 957 serialize_unit_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, ) -> Result<Value, crate::ser::Error>958 fn serialize_unit_variant( 959 self, 960 _name: &'static str, 961 _variant_index: u32, 962 _variant: &'static str, 963 ) -> Result<Value, crate::ser::Error> { 964 self.serialize_str(_variant) 965 } 966 serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, value: &T, ) -> Result<Value, crate::ser::Error> where T: ser::Serialize,967 fn serialize_newtype_struct<T: ?Sized>( 968 self, 969 _name: &'static str, 970 value: &T, 971 ) -> Result<Value, crate::ser::Error> 972 where 973 T: ser::Serialize, 974 { 975 value.serialize(self) 976 } 977 serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<Value, crate::ser::Error> where T: ser::Serialize,978 fn serialize_newtype_variant<T: ?Sized>( 979 self, 980 _name: &'static str, 981 _variant_index: u32, 982 variant: &'static str, 983 value: &T, 984 ) -> Result<Value, crate::ser::Error> 985 where 986 T: ser::Serialize, 987 { 988 let value = value.serialize(ValueSerializer)?; 989 let mut table = Table::new(); 990 table.insert(variant.to_owned(), value); 991 Ok(table.into()) 992 } 993 serialize_none(self) -> Result<Value, crate::ser::Error>994 fn serialize_none(self) -> Result<Value, crate::ser::Error> { 995 Err(crate::ser::Error::unsupported_none()) 996 } 997 serialize_some<T: ?Sized>(self, value: &T) -> Result<Value, crate::ser::Error> where T: ser::Serialize,998 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Value, crate::ser::Error> 999 where 1000 T: ser::Serialize, 1001 { 1002 value.serialize(self) 1003 } 1004 serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error>1005 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> { 1006 Ok(ValueSerializeVec { 1007 vec: Vec::with_capacity(len.unwrap_or(0)), 1008 }) 1009 } 1010 serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, crate::ser::Error>1011 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> { 1012 self.serialize_seq(Some(len)) 1013 } 1014 serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, crate::ser::Error>1015 fn serialize_tuple_struct( 1016 self, 1017 _name: &'static str, 1018 len: usize, 1019 ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> { 1020 self.serialize_seq(Some(len)) 1021 } 1022 serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, crate::ser::Error>1023 fn serialize_tuple_variant( 1024 self, 1025 _name: &'static str, 1026 _variant_index: u32, 1027 variant: &'static str, 1028 len: usize, 1029 ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> { 1030 Ok(ValueSerializeTupleVariant::tuple(variant, len)) 1031 } 1032 serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error>1033 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> { 1034 Ok(ValueSerializeMap { 1035 ser: SerializeMap { 1036 map: Table::new(), 1037 next_key: None, 1038 }, 1039 }) 1040 } 1041 serialize_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, crate::ser::Error>1042 fn serialize_struct( 1043 self, 1044 _name: &'static str, 1045 len: usize, 1046 ) -> Result<Self::SerializeStruct, crate::ser::Error> { 1047 self.serialize_map(Some(len)) 1048 } 1049 serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeStructVariant, crate::ser::Error>1050 fn serialize_struct_variant( 1051 self, 1052 _name: &'static str, 1053 _variant_index: u32, 1054 variant: &'static str, 1055 len: usize, 1056 ) -> Result<Self::SerializeStructVariant, crate::ser::Error> { 1057 Ok(ValueSerializeStructVariant::struct_(variant, len)) 1058 } 1059 } 1060 1061 pub(crate) struct TableSerializer; 1062 1063 impl ser::Serializer for TableSerializer { 1064 type Ok = Table; 1065 type Error = crate::ser::Error; 1066 1067 type SerializeSeq = ser::Impossible<Table, crate::ser::Error>; 1068 type SerializeTuple = ser::Impossible<Table, crate::ser::Error>; 1069 type SerializeTupleStruct = ser::Impossible<Table, crate::ser::Error>; 1070 type SerializeTupleVariant = ser::Impossible<Table, crate::ser::Error>; 1071 type SerializeMap = SerializeMap; 1072 type SerializeStruct = SerializeMap; 1073 type SerializeStructVariant = ser::Impossible<Table, crate::ser::Error>; 1074 serialize_bool(self, _value: bool) -> Result<Table, crate::ser::Error>1075 fn serialize_bool(self, _value: bool) -> Result<Table, crate::ser::Error> { 1076 Err(crate::ser::Error::unsupported_type(None)) 1077 } 1078 serialize_i8(self, _value: i8) -> Result<Table, crate::ser::Error>1079 fn serialize_i8(self, _value: i8) -> Result<Table, crate::ser::Error> { 1080 Err(crate::ser::Error::unsupported_type(None)) 1081 } 1082 serialize_i16(self, _value: i16) -> Result<Table, crate::ser::Error>1083 fn serialize_i16(self, _value: i16) -> Result<Table, crate::ser::Error> { 1084 Err(crate::ser::Error::unsupported_type(None)) 1085 } 1086 serialize_i32(self, _value: i32) -> Result<Table, crate::ser::Error>1087 fn serialize_i32(self, _value: i32) -> Result<Table, crate::ser::Error> { 1088 Err(crate::ser::Error::unsupported_type(None)) 1089 } 1090 serialize_i64(self, _value: i64) -> Result<Table, crate::ser::Error>1091 fn serialize_i64(self, _value: i64) -> Result<Table, crate::ser::Error> { 1092 Err(crate::ser::Error::unsupported_type(None)) 1093 } 1094 serialize_u8(self, _value: u8) -> Result<Table, crate::ser::Error>1095 fn serialize_u8(self, _value: u8) -> Result<Table, crate::ser::Error> { 1096 Err(crate::ser::Error::unsupported_type(None)) 1097 } 1098 serialize_u16(self, _value: u16) -> Result<Table, crate::ser::Error>1099 fn serialize_u16(self, _value: u16) -> Result<Table, crate::ser::Error> { 1100 Err(crate::ser::Error::unsupported_type(None)) 1101 } 1102 serialize_u32(self, _value: u32) -> Result<Table, crate::ser::Error>1103 fn serialize_u32(self, _value: u32) -> Result<Table, crate::ser::Error> { 1104 Err(crate::ser::Error::unsupported_type(None)) 1105 } 1106 serialize_u64(self, _value: u64) -> Result<Table, crate::ser::Error>1107 fn serialize_u64(self, _value: u64) -> Result<Table, crate::ser::Error> { 1108 Err(crate::ser::Error::unsupported_type(None)) 1109 } 1110 serialize_f32(self, _value: f32) -> Result<Table, crate::ser::Error>1111 fn serialize_f32(self, _value: f32) -> Result<Table, crate::ser::Error> { 1112 Err(crate::ser::Error::unsupported_type(None)) 1113 } 1114 serialize_f64(self, _value: f64) -> Result<Table, crate::ser::Error>1115 fn serialize_f64(self, _value: f64) -> Result<Table, crate::ser::Error> { 1116 Err(crate::ser::Error::unsupported_type(None)) 1117 } 1118 serialize_char(self, _value: char) -> Result<Table, crate::ser::Error>1119 fn serialize_char(self, _value: char) -> Result<Table, crate::ser::Error> { 1120 Err(crate::ser::Error::unsupported_type(None)) 1121 } 1122 serialize_str(self, _value: &str) -> Result<Table, crate::ser::Error>1123 fn serialize_str(self, _value: &str) -> Result<Table, crate::ser::Error> { 1124 Err(crate::ser::Error::unsupported_type(None)) 1125 } 1126 serialize_bytes(self, _value: &[u8]) -> Result<Table, crate::ser::Error>1127 fn serialize_bytes(self, _value: &[u8]) -> Result<Table, crate::ser::Error> { 1128 Err(crate::ser::Error::unsupported_type(None)) 1129 } 1130 serialize_unit(self) -> Result<Table, crate::ser::Error>1131 fn serialize_unit(self) -> Result<Table, crate::ser::Error> { 1132 Err(crate::ser::Error::unsupported_type(None)) 1133 } 1134 serialize_unit_struct(self, _name: &'static str) -> Result<Table, crate::ser::Error>1135 fn serialize_unit_struct(self, _name: &'static str) -> Result<Table, crate::ser::Error> { 1136 Err(crate::ser::Error::unsupported_type(None)) 1137 } 1138 serialize_unit_variant( self, name: &'static str, _variant_index: u32, _variant: &'static str, ) -> Result<Table, crate::ser::Error>1139 fn serialize_unit_variant( 1140 self, 1141 name: &'static str, 1142 _variant_index: u32, 1143 _variant: &'static str, 1144 ) -> Result<Table, crate::ser::Error> { 1145 Err(crate::ser::Error::unsupported_type(Some(name))) 1146 } 1147 serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, value: &T, ) -> Result<Table, crate::ser::Error> where T: ser::Serialize,1148 fn serialize_newtype_struct<T: ?Sized>( 1149 self, 1150 _name: &'static str, 1151 value: &T, 1152 ) -> Result<Table, crate::ser::Error> 1153 where 1154 T: ser::Serialize, 1155 { 1156 value.serialize(self) 1157 } 1158 serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<Table, crate::ser::Error> where T: ser::Serialize,1159 fn serialize_newtype_variant<T: ?Sized>( 1160 self, 1161 _name: &'static str, 1162 _variant_index: u32, 1163 variant: &'static str, 1164 value: &T, 1165 ) -> Result<Table, crate::ser::Error> 1166 where 1167 T: ser::Serialize, 1168 { 1169 let value = value.serialize(ValueSerializer)?; 1170 let mut table = Table::new(); 1171 table.insert(variant.to_owned(), value); 1172 Ok(table) 1173 } 1174 serialize_none(self) -> Result<Table, crate::ser::Error>1175 fn serialize_none(self) -> Result<Table, crate::ser::Error> { 1176 Err(crate::ser::Error::unsupported_none()) 1177 } 1178 serialize_some<T: ?Sized>(self, value: &T) -> Result<Table, crate::ser::Error> where T: ser::Serialize,1179 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Table, crate::ser::Error> 1180 where 1181 T: ser::Serialize, 1182 { 1183 value.serialize(self) 1184 } 1185 serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error>1186 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, crate::ser::Error> { 1187 Err(crate::ser::Error::unsupported_type(None)) 1188 } 1189 serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, crate::ser::Error>1190 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, crate::ser::Error> { 1191 Err(crate::ser::Error::unsupported_type(None)) 1192 } 1193 serialize_tuple_struct( self, name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct, crate::ser::Error>1194 fn serialize_tuple_struct( 1195 self, 1196 name: &'static str, 1197 _len: usize, 1198 ) -> Result<Self::SerializeTupleStruct, crate::ser::Error> { 1199 Err(crate::ser::Error::unsupported_type(Some(name))) 1200 } 1201 serialize_tuple_variant( self, name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, crate::ser::Error>1202 fn serialize_tuple_variant( 1203 self, 1204 name: &'static str, 1205 _variant_index: u32, 1206 _variant: &'static str, 1207 _len: usize, 1208 ) -> Result<Self::SerializeTupleVariant, crate::ser::Error> { 1209 Err(crate::ser::Error::unsupported_type(Some(name))) 1210 } 1211 serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error>1212 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, crate::ser::Error> { 1213 Ok(SerializeMap { 1214 map: Table::new(), 1215 next_key: None, 1216 }) 1217 } 1218 serialize_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, crate::ser::Error>1219 fn serialize_struct( 1220 self, 1221 _name: &'static str, 1222 len: usize, 1223 ) -> Result<Self::SerializeStruct, crate::ser::Error> { 1224 self.serialize_map(Some(len)) 1225 } 1226 serialize_struct_variant( self, name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, crate::ser::Error>1227 fn serialize_struct_variant( 1228 self, 1229 name: &'static str, 1230 _variant_index: u32, 1231 _variant: &'static str, 1232 _len: usize, 1233 ) -> Result<Self::SerializeStructVariant, crate::ser::Error> { 1234 Err(crate::ser::Error::unsupported_type(Some(name))) 1235 } 1236 } 1237 1238 struct ValueSerializeVec { 1239 vec: Vec<Value>, 1240 } 1241 1242 impl ser::SerializeSeq for ValueSerializeVec { 1243 type Ok = Value; 1244 type Error = crate::ser::Error; 1245 serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1246 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> 1247 where 1248 T: ser::Serialize, 1249 { 1250 self.vec.push(Value::try_from(value)?); 1251 Ok(()) 1252 } 1253 end(self) -> Result<Value, crate::ser::Error>1254 fn end(self) -> Result<Value, crate::ser::Error> { 1255 Ok(Value::Array(self.vec)) 1256 } 1257 } 1258 1259 impl ser::SerializeTuple for ValueSerializeVec { 1260 type Ok = Value; 1261 type Error = crate::ser::Error; 1262 serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1263 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> 1264 where 1265 T: ser::Serialize, 1266 { 1267 ser::SerializeSeq::serialize_element(self, value) 1268 } 1269 end(self) -> Result<Value, crate::ser::Error>1270 fn end(self) -> Result<Value, crate::ser::Error> { 1271 ser::SerializeSeq::end(self) 1272 } 1273 } 1274 1275 impl ser::SerializeTupleStruct for ValueSerializeVec { 1276 type Ok = Value; 1277 type Error = crate::ser::Error; 1278 serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1279 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> 1280 where 1281 T: ser::Serialize, 1282 { 1283 ser::SerializeSeq::serialize_element(self, value) 1284 } 1285 end(self) -> Result<Value, crate::ser::Error>1286 fn end(self) -> Result<Value, crate::ser::Error> { 1287 ser::SerializeSeq::end(self) 1288 } 1289 } 1290 1291 impl ser::SerializeTupleVariant for ValueSerializeVec { 1292 type Ok = Value; 1293 type Error = crate::ser::Error; 1294 serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1295 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> 1296 where 1297 T: ser::Serialize, 1298 { 1299 ser::SerializeSeq::serialize_element(self, value) 1300 } 1301 end(self) -> Result<Value, crate::ser::Error>1302 fn end(self) -> Result<Value, crate::ser::Error> { 1303 ser::SerializeSeq::end(self) 1304 } 1305 } 1306 1307 pub(crate) struct SerializeMap { 1308 map: Table, 1309 next_key: Option<String>, 1310 } 1311 1312 impl ser::SerializeMap for SerializeMap { 1313 type Ok = Table; 1314 type Error = crate::ser::Error; 1315 serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1316 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), crate::ser::Error> 1317 where 1318 T: ser::Serialize, 1319 { 1320 match Value::try_from(key)? { 1321 Value::String(s) => self.next_key = Some(s), 1322 _ => return Err(crate::ser::Error::key_not_string()), 1323 }; 1324 Ok(()) 1325 } 1326 serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1327 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> 1328 where 1329 T: ser::Serialize, 1330 { 1331 let key = self.next_key.take(); 1332 let key = key.expect("serialize_value called before serialize_key"); 1333 match Value::try_from(value) { 1334 Ok(value) => { 1335 self.map.insert(key, value); 1336 } 1337 Err(crate::ser::Error { 1338 inner: crate::edit::ser::Error::UnsupportedNone, 1339 }) => {} 1340 Err(e) => return Err(e), 1341 } 1342 Ok(()) 1343 } 1344 end(self) -> Result<Table, crate::ser::Error>1345 fn end(self) -> Result<Table, crate::ser::Error> { 1346 Ok(self.map) 1347 } 1348 } 1349 1350 impl ser::SerializeStruct for SerializeMap { 1351 type Ok = Table; 1352 type Error = crate::ser::Error; 1353 serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), crate::ser::Error> where T: ser::Serialize,1354 fn serialize_field<T: ?Sized>( 1355 &mut self, 1356 key: &'static str, 1357 value: &T, 1358 ) -> Result<(), crate::ser::Error> 1359 where 1360 T: ser::Serialize, 1361 { 1362 ser::SerializeMap::serialize_key(self, key)?; 1363 ser::SerializeMap::serialize_value(self, value) 1364 } 1365 end(self) -> Result<Table, crate::ser::Error>1366 fn end(self) -> Result<Table, crate::ser::Error> { 1367 ser::SerializeMap::end(self) 1368 } 1369 } 1370 1371 struct ValueSerializeMap { 1372 ser: SerializeMap, 1373 } 1374 1375 impl ser::SerializeMap for ValueSerializeMap { 1376 type Ok = Value; 1377 type Error = crate::ser::Error; 1378 serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1379 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), crate::ser::Error> 1380 where 1381 T: ser::Serialize, 1382 { 1383 self.ser.serialize_key(key) 1384 } 1385 serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> where T: ser::Serialize,1386 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), crate::ser::Error> 1387 where 1388 T: ser::Serialize, 1389 { 1390 self.ser.serialize_value(value) 1391 } 1392 end(self) -> Result<Value, crate::ser::Error>1393 fn end(self) -> Result<Value, crate::ser::Error> { 1394 self.ser.end().map(Value::Table) 1395 } 1396 } 1397 1398 impl ser::SerializeStruct for ValueSerializeMap { 1399 type Ok = Value; 1400 type Error = crate::ser::Error; 1401 serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), crate::ser::Error> where T: ser::Serialize,1402 fn serialize_field<T: ?Sized>( 1403 &mut self, 1404 key: &'static str, 1405 value: &T, 1406 ) -> Result<(), crate::ser::Error> 1407 where 1408 T: ser::Serialize, 1409 { 1410 ser::SerializeMap::serialize_key(self, key)?; 1411 ser::SerializeMap::serialize_value(self, value) 1412 } 1413 end(self) -> Result<Value, crate::ser::Error>1414 fn end(self) -> Result<Value, crate::ser::Error> { 1415 ser::SerializeMap::end(self) 1416 } 1417 } 1418 1419 struct DatetimeOrTable<'a> { 1420 key: &'a mut String, 1421 } 1422 1423 impl<'a, 'de> de::DeserializeSeed<'de> for DatetimeOrTable<'a> { 1424 type Value = bool; 1425 deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> where D: de::Deserializer<'de>,1426 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error> 1427 where 1428 D: de::Deserializer<'de>, 1429 { 1430 deserializer.deserialize_any(self) 1431 } 1432 } 1433 1434 impl<'a, 'de> de::Visitor<'de> for DatetimeOrTable<'a> { 1435 type Value = bool; 1436 expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result1437 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { 1438 formatter.write_str("a string key") 1439 } 1440 visit_str<E>(self, s: &str) -> Result<bool, E> where E: de::Error,1441 fn visit_str<E>(self, s: &str) -> Result<bool, E> 1442 where 1443 E: de::Error, 1444 { 1445 if s == datetime::FIELD { 1446 Ok(true) 1447 } else { 1448 self.key.push_str(s); 1449 Ok(false) 1450 } 1451 } 1452 visit_string<E>(self, s: String) -> Result<bool, E> where E: de::Error,1453 fn visit_string<E>(self, s: String) -> Result<bool, E> 1454 where 1455 E: de::Error, 1456 { 1457 if s == datetime::FIELD { 1458 Ok(true) 1459 } else { 1460 *self.key = s; 1461 Ok(false) 1462 } 1463 } 1464 } 1465 1466 type ValueSerializeTupleVariant = ValueSerializeVariant<ValueSerializeVec>; 1467 type ValueSerializeStructVariant = ValueSerializeVariant<ValueSerializeMap>; 1468 1469 struct ValueSerializeVariant<T> { 1470 variant: &'static str, 1471 inner: T, 1472 } 1473 1474 impl ValueSerializeVariant<ValueSerializeVec> { tuple(variant: &'static str, len: usize) -> Self1475 pub(crate) fn tuple(variant: &'static str, len: usize) -> Self { 1476 Self { 1477 variant, 1478 inner: ValueSerializeVec { 1479 vec: Vec::with_capacity(len), 1480 }, 1481 } 1482 } 1483 } 1484 1485 impl ValueSerializeVariant<ValueSerializeMap> { struct_(variant: &'static str, len: usize) -> Self1486 pub(crate) fn struct_(variant: &'static str, len: usize) -> Self { 1487 Self { 1488 variant, 1489 inner: ValueSerializeMap { 1490 ser: SerializeMap { 1491 map: Table::with_capacity(len), 1492 next_key: None, 1493 }, 1494 }, 1495 } 1496 } 1497 } 1498 1499 impl serde::ser::SerializeTupleVariant for ValueSerializeVariant<ValueSerializeVec> { 1500 type Ok = crate::Value; 1501 type Error = crate::ser::Error; 1502 serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,1503 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> 1504 where 1505 T: serde::ser::Serialize, 1506 { 1507 serde::ser::SerializeSeq::serialize_element(&mut self.inner, value) 1508 } 1509 end(self) -> Result<Self::Ok, Self::Error>1510 fn end(self) -> Result<Self::Ok, Self::Error> { 1511 let inner = serde::ser::SerializeSeq::end(self.inner)?; 1512 let mut table = Table::new(); 1513 table.insert(self.variant.to_owned(), inner); 1514 Ok(Value::Table(table)) 1515 } 1516 } 1517 1518 impl serde::ser::SerializeStructVariant for ValueSerializeVariant<ValueSerializeMap> { 1519 type Ok = crate::Value; 1520 type Error = crate::ser::Error; 1521 1522 #[inline] serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize + ?Sized,1523 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> 1524 where 1525 T: serde::ser::Serialize + ?Sized, 1526 { 1527 serde::ser::SerializeStruct::serialize_field(&mut self.inner, key, value) 1528 } 1529 1530 #[inline] end(self) -> Result<Self::Ok, Self::Error>1531 fn end(self) -> Result<Self::Ok, Self::Error> { 1532 let inner = serde::ser::SerializeStruct::end(self.inner)?; 1533 let mut table = Table::new(); 1534 table.insert(self.variant.to_owned(), inner); 1535 Ok(Value::Table(table)) 1536 } 1537 } 1538