1 use super::{Error, KeySerializer, SerializeValueArray, ValueSerializer}; 2 3 #[doc(hidden)] 4 pub enum SerializeMap { 5 Datetime(SerializeDatetime), 6 Table(SerializeInlineTable), 7 } 8 9 impl SerializeMap { table() -> Self10 pub(crate) fn table() -> Self { 11 Self::Table(SerializeInlineTable::new()) 12 } 13 table_with_capacity(len: usize) -> Self14 pub(crate) fn table_with_capacity(len: usize) -> Self { 15 Self::Table(SerializeInlineTable::with_capacity(len)) 16 } 17 datetime() -> Self18 pub(crate) fn datetime() -> Self { 19 Self::Datetime(SerializeDatetime::new()) 20 } 21 } 22 23 impl serde::ser::SerializeMap for SerializeMap { 24 type Ok = crate::Value; 25 type Error = Error; 26 serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,27 fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error> 28 where 29 T: serde::ser::Serialize, 30 { 31 match self { 32 Self::Datetime(s) => s.serialize_key(input), 33 Self::Table(s) => s.serialize_key(input), 34 } 35 } 36 serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,37 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> 38 where 39 T: serde::ser::Serialize, 40 { 41 match self { 42 Self::Datetime(s) => s.serialize_value(value), 43 Self::Table(s) => s.serialize_value(value), 44 } 45 } 46 end(self) -> Result<Self::Ok, Self::Error>47 fn end(self) -> Result<Self::Ok, Self::Error> { 48 match self { 49 Self::Datetime(s) => s.end().map(|items| items.into()), 50 Self::Table(s) => s.end().map(|items| items.into()), 51 } 52 } 53 } 54 55 impl serde::ser::SerializeStruct for SerializeMap { 56 type Ok = crate::Value; 57 type Error = Error; 58 serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: serde::ser::Serialize,59 fn serialize_field<T: ?Sized>( 60 &mut self, 61 key: &'static str, 62 value: &T, 63 ) -> Result<(), Self::Error> 64 where 65 T: serde::ser::Serialize, 66 { 67 match self { 68 Self::Datetime(s) => s.serialize_field(key, value), 69 Self::Table(s) => s.serialize_field(key, value), 70 } 71 } 72 end(self) -> Result<Self::Ok, Self::Error>73 fn end(self) -> Result<Self::Ok, Self::Error> { 74 match self { 75 Self::Datetime(s) => s.end().map(|items| items.into()), 76 Self::Table(s) => s.end().map(|items| items.into()), 77 } 78 } 79 } 80 81 #[doc(hidden)] 82 pub struct SerializeDatetime { 83 value: Option<crate::Datetime>, 84 } 85 86 impl SerializeDatetime { new() -> Self87 pub(crate) fn new() -> Self { 88 Self { value: None } 89 } 90 } 91 92 impl serde::ser::SerializeMap for SerializeDatetime { 93 type Ok = crate::Datetime; 94 type Error = Error; 95 serialize_key<T: ?Sized>(&mut self, _input: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,96 fn serialize_key<T: ?Sized>(&mut self, _input: &T) -> Result<(), Self::Error> 97 where 98 T: serde::ser::Serialize, 99 { 100 unreachable!("datetimes should only be serialized as structs, not maps") 101 } 102 serialize_value<T: ?Sized>(&mut self, _value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,103 fn serialize_value<T: ?Sized>(&mut self, _value: &T) -> Result<(), Self::Error> 104 where 105 T: serde::ser::Serialize, 106 { 107 unreachable!("datetimes should only be serialized as structs, not maps") 108 } 109 end(self) -> Result<Self::Ok, Self::Error>110 fn end(self) -> Result<Self::Ok, Self::Error> { 111 unreachable!("datetimes should only be serialized as structs, not maps") 112 } 113 } 114 115 impl serde::ser::SerializeStruct for SerializeDatetime { 116 type Ok = crate::Datetime; 117 type Error = Error; 118 serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: serde::ser::Serialize,119 fn serialize_field<T: ?Sized>( 120 &mut self, 121 key: &'static str, 122 value: &T, 123 ) -> Result<(), Self::Error> 124 where 125 T: serde::ser::Serialize, 126 { 127 if key == toml_datetime::__unstable::FIELD { 128 self.value = Some(value.serialize(DatetimeFieldSerializer::default())?); 129 } 130 131 Ok(()) 132 } 133 end(self) -> Result<Self::Ok, Self::Error>134 fn end(self) -> Result<Self::Ok, Self::Error> { 135 self.value.ok_or(Error::UnsupportedNone) 136 } 137 } 138 139 #[doc(hidden)] 140 pub struct SerializeInlineTable { 141 items: crate::table::KeyValuePairs, 142 key: Option<crate::InternalString>, 143 } 144 145 impl SerializeInlineTable { new() -> Self146 pub(crate) fn new() -> Self { 147 Self { 148 items: Default::default(), 149 key: Default::default(), 150 } 151 } 152 with_capacity(len: usize) -> Self153 pub(crate) fn with_capacity(len: usize) -> Self { 154 let mut s = Self::new(); 155 s.items.reserve(len); 156 s 157 } 158 } 159 160 impl serde::ser::SerializeMap for SerializeInlineTable { 161 type Ok = crate::InlineTable; 162 type Error = Error; 163 serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,164 fn serialize_key<T: ?Sized>(&mut self, input: &T) -> Result<(), Self::Error> 165 where 166 T: serde::ser::Serialize, 167 { 168 self.key = Some(input.serialize(KeySerializer)?); 169 Ok(()) 170 } 171 serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize,172 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error> 173 where 174 T: serde::ser::Serialize, 175 { 176 let mut value_serializer = MapValueSerializer::new(); 177 let res = value.serialize(&mut value_serializer); 178 match res { 179 Ok(item) => { 180 let key = self.key.take().unwrap(); 181 let kv = crate::table::TableKeyValue::new( 182 crate::Key::new(&key), 183 crate::Item::Value(item), 184 ); 185 self.items.insert(key, kv); 186 } 187 Err(e) => { 188 if !(e == Error::UnsupportedNone && value_serializer.is_none) { 189 return Err(e); 190 } 191 } 192 } 193 Ok(()) 194 } 195 end(self) -> Result<Self::Ok, Self::Error>196 fn end(self) -> Result<Self::Ok, Self::Error> { 197 Ok(crate::InlineTable::with_pairs(self.items)) 198 } 199 } 200 201 impl serde::ser::SerializeStruct for SerializeInlineTable { 202 type Ok = crate::InlineTable; 203 type Error = Error; 204 serialize_field<T: ?Sized>( &mut self, key: &'static str, value: &T, ) -> Result<(), Self::Error> where T: serde::ser::Serialize,205 fn serialize_field<T: ?Sized>( 206 &mut self, 207 key: &'static str, 208 value: &T, 209 ) -> Result<(), Self::Error> 210 where 211 T: serde::ser::Serialize, 212 { 213 let mut value_serializer = MapValueSerializer::new(); 214 let res = value.serialize(&mut value_serializer); 215 match res { 216 Ok(item) => { 217 let kv = crate::table::TableKeyValue::new( 218 crate::Key::new(key), 219 crate::Item::Value(item), 220 ); 221 self.items.insert(crate::InternalString::from(key), kv); 222 } 223 Err(e) => { 224 if !(e == Error::UnsupportedNone && value_serializer.is_none) { 225 return Err(e); 226 } 227 } 228 }; 229 Ok(()) 230 } 231 end(self) -> Result<Self::Ok, Self::Error>232 fn end(self) -> Result<Self::Ok, Self::Error> { 233 Ok(crate::InlineTable::with_pairs(self.items)) 234 } 235 } 236 237 #[derive(Default)] 238 struct DatetimeFieldSerializer {} 239 240 impl serde::ser::Serializer for DatetimeFieldSerializer { 241 type Ok = toml_datetime::Datetime; 242 type Error = Error; 243 type SerializeSeq = serde::ser::Impossible<Self::Ok, Self::Error>; 244 type SerializeTuple = serde::ser::Impossible<Self::Ok, Self::Error>; 245 type SerializeTupleStruct = serde::ser::Impossible<Self::Ok, Self::Error>; 246 type SerializeTupleVariant = serde::ser::Impossible<Self::Ok, Self::Error>; 247 type SerializeMap = serde::ser::Impossible<Self::Ok, Self::Error>; 248 type SerializeStruct = serde::ser::Impossible<Self::Ok, Self::Error>; 249 type SerializeStructVariant = serde::ser::Impossible<Self::Ok, Self::Error>; 250 serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error>251 fn serialize_bool(self, _value: bool) -> Result<Self::Ok, Self::Error> { 252 Err(Error::DateInvalid) 253 } 254 serialize_i8(self, _value: i8) -> Result<Self::Ok, Self::Error>255 fn serialize_i8(self, _value: i8) -> Result<Self::Ok, Self::Error> { 256 Err(Error::DateInvalid) 257 } 258 serialize_i16(self, _value: i16) -> Result<Self::Ok, Self::Error>259 fn serialize_i16(self, _value: i16) -> Result<Self::Ok, Self::Error> { 260 Err(Error::DateInvalid) 261 } 262 serialize_i32(self, _value: i32) -> Result<Self::Ok, Self::Error>263 fn serialize_i32(self, _value: i32) -> Result<Self::Ok, Self::Error> { 264 Err(Error::DateInvalid) 265 } 266 serialize_i64(self, _value: i64) -> Result<Self::Ok, Self::Error>267 fn serialize_i64(self, _value: i64) -> Result<Self::Ok, Self::Error> { 268 Err(Error::DateInvalid) 269 } 270 serialize_u8(self, _value: u8) -> Result<Self::Ok, Self::Error>271 fn serialize_u8(self, _value: u8) -> Result<Self::Ok, Self::Error> { 272 Err(Error::DateInvalid) 273 } 274 serialize_u16(self, _value: u16) -> Result<Self::Ok, Self::Error>275 fn serialize_u16(self, _value: u16) -> Result<Self::Ok, Self::Error> { 276 Err(Error::DateInvalid) 277 } 278 serialize_u32(self, _value: u32) -> Result<Self::Ok, Self::Error>279 fn serialize_u32(self, _value: u32) -> Result<Self::Ok, Self::Error> { 280 Err(Error::DateInvalid) 281 } 282 serialize_u64(self, _value: u64) -> Result<Self::Ok, Self::Error>283 fn serialize_u64(self, _value: u64) -> Result<Self::Ok, Self::Error> { 284 Err(Error::DateInvalid) 285 } 286 serialize_f32(self, _value: f32) -> Result<Self::Ok, Self::Error>287 fn serialize_f32(self, _value: f32) -> Result<Self::Ok, Self::Error> { 288 Err(Error::DateInvalid) 289 } 290 serialize_f64(self, _value: f64) -> Result<Self::Ok, Self::Error>291 fn serialize_f64(self, _value: f64) -> Result<Self::Ok, Self::Error> { 292 Err(Error::DateInvalid) 293 } 294 serialize_char(self, _value: char) -> Result<Self::Ok, Self::Error>295 fn serialize_char(self, _value: char) -> Result<Self::Ok, Self::Error> { 296 Err(Error::DateInvalid) 297 } 298 serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>299 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> { 300 v.parse::<toml_datetime::Datetime>().map_err(Error::custom) 301 } 302 serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error>303 fn serialize_bytes(self, _value: &[u8]) -> Result<Self::Ok, Self::Error> { 304 Err(Error::DateInvalid) 305 } 306 serialize_none(self) -> Result<Self::Ok, Self::Error>307 fn serialize_none(self) -> Result<Self::Ok, Self::Error> { 308 Err(Error::DateInvalid) 309 } 310 serialize_some<T: ?Sized>(self, _value: &T) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,311 fn serialize_some<T: ?Sized>(self, _value: &T) -> Result<Self::Ok, Self::Error> 312 where 313 T: serde::ser::Serialize, 314 { 315 Err(Error::DateInvalid) 316 } 317 serialize_unit(self) -> Result<Self::Ok, Self::Error>318 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> { 319 Err(Error::DateInvalid) 320 } 321 serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error>322 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok, Self::Error> { 323 Err(Error::DateInvalid) 324 } 325 serialize_unit_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, ) -> Result<Self::Ok, Self::Error>326 fn serialize_unit_variant( 327 self, 328 _name: &'static str, 329 _variant_index: u32, 330 _variant: &'static str, 331 ) -> Result<Self::Ok, Self::Error> { 332 Err(Error::DateInvalid) 333 } 334 serialize_newtype_struct<T: ?Sized>( self, _name: &'static str, _value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,335 fn serialize_newtype_struct<T: ?Sized>( 336 self, 337 _name: &'static str, 338 _value: &T, 339 ) -> Result<Self::Ok, Self::Error> 340 where 341 T: serde::ser::Serialize, 342 { 343 Err(Error::DateInvalid) 344 } 345 serialize_newtype_variant<T: ?Sized>( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,346 fn serialize_newtype_variant<T: ?Sized>( 347 self, 348 _name: &'static str, 349 _variant_index: u32, 350 _variant: &'static str, 351 _value: &T, 352 ) -> Result<Self::Ok, Self::Error> 353 where 354 T: serde::ser::Serialize, 355 { 356 Err(Error::DateInvalid) 357 } 358 serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>359 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { 360 Err(Error::DateInvalid) 361 } 362 serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error>363 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple, Self::Error> { 364 Err(Error::DateInvalid) 365 } 366 serialize_tuple_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>367 fn serialize_tuple_struct( 368 self, 369 _name: &'static str, 370 _len: usize, 371 ) -> Result<Self::SerializeTupleStruct, Self::Error> { 372 Err(Error::DateInvalid) 373 } 374 serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>375 fn serialize_tuple_variant( 376 self, 377 _name: &'static str, 378 _variant_index: u32, 379 _variant: &'static str, 380 _len: usize, 381 ) -> Result<Self::SerializeTupleVariant, Self::Error> { 382 Err(Error::DateInvalid) 383 } 384 serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>385 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { 386 Err(Error::DateInvalid) 387 } 388 serialize_struct( self, _name: &'static str, _len: usize, ) -> Result<Self::SerializeStruct, Self::Error>389 fn serialize_struct( 390 self, 391 _name: &'static str, 392 _len: usize, 393 ) -> Result<Self::SerializeStruct, Self::Error> { 394 Err(Error::DateInvalid) 395 } 396 serialize_struct_variant( self, _name: &'static str, _variant_index: u32, _variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>397 fn serialize_struct_variant( 398 self, 399 _name: &'static str, 400 _variant_index: u32, 401 _variant: &'static str, 402 _len: usize, 403 ) -> Result<Self::SerializeStructVariant, Self::Error> { 404 Err(Error::DateInvalid) 405 } 406 } 407 408 #[derive(Default)] 409 struct MapValueSerializer { 410 is_none: bool, 411 } 412 413 impl MapValueSerializer { new() -> Self414 fn new() -> Self { 415 Self { is_none: false } 416 } 417 } 418 419 impl serde::ser::Serializer for &mut MapValueSerializer { 420 type Ok = crate::Value; 421 type Error = Error; 422 type SerializeSeq = super::SerializeValueArray; 423 type SerializeTuple = super::SerializeValueArray; 424 type SerializeTupleStruct = super::SerializeValueArray; 425 type SerializeTupleVariant = super::SerializeTupleVariant; 426 type SerializeMap = super::SerializeMap; 427 type SerializeStruct = super::SerializeMap; 428 type SerializeStructVariant = super::SerializeStructVariant; 429 serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>430 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> { 431 ValueSerializer::new().serialize_bool(v) 432 } 433 serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>434 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> { 435 ValueSerializer::new().serialize_i8(v) 436 } 437 serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>438 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> { 439 ValueSerializer::new().serialize_i16(v) 440 } 441 serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>442 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> { 443 ValueSerializer::new().serialize_i32(v) 444 } 445 serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>446 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> { 447 ValueSerializer::new().serialize_i64(v) 448 } 449 serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>450 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> { 451 ValueSerializer::new().serialize_u8(v) 452 } 453 serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>454 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> { 455 ValueSerializer::new().serialize_u16(v) 456 } 457 serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>458 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> { 459 ValueSerializer::new().serialize_u32(v) 460 } 461 serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>462 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> { 463 ValueSerializer::new().serialize_u64(v) 464 } 465 serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>466 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> { 467 ValueSerializer::new().serialize_f32(v) 468 } 469 serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error>470 fn serialize_f64(self, v: f64) -> Result<Self::Ok, Self::Error> { 471 ValueSerializer::new().serialize_f64(v) 472 } 473 serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>474 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> { 475 ValueSerializer::new().serialize_char(v) 476 } 477 serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>478 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> { 479 ValueSerializer::new().serialize_str(v) 480 } 481 serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error>482 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> { 483 ValueSerializer::new().serialize_bytes(value) 484 } 485 serialize_none(self) -> Result<Self::Ok, Self::Error>486 fn serialize_none(self) -> Result<Self::Ok, Self::Error> { 487 self.is_none = true; 488 Err(Error::UnsupportedNone) 489 } 490 serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,491 fn serialize_some<T: ?Sized>(self, value: &T) -> Result<Self::Ok, Self::Error> 492 where 493 T: serde::ser::Serialize, 494 { 495 ValueSerializer::new().serialize_some(value) 496 } 497 serialize_unit(self) -> Result<Self::Ok, Self::Error>498 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> { 499 ValueSerializer::new().serialize_unit() 500 } 501 serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>502 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> { 503 ValueSerializer::new().serialize_unit_struct(name) 504 } 505 serialize_unit_variant( self, name: &'static str, variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>506 fn serialize_unit_variant( 507 self, 508 name: &'static str, 509 variant_index: u32, 510 variant: &'static str, 511 ) -> Result<Self::Ok, Self::Error> { 512 ValueSerializer::new().serialize_unit_variant(name, variant_index, variant) 513 } 514 serialize_newtype_struct<T: ?Sized>( self, name: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,515 fn serialize_newtype_struct<T: ?Sized>( 516 self, 517 name: &'static str, 518 value: &T, 519 ) -> Result<Self::Ok, Self::Error> 520 where 521 T: serde::ser::Serialize, 522 { 523 ValueSerializer::new().serialize_newtype_struct(name, value) 524 } 525 serialize_newtype_variant<T: ?Sized>( self, name: &'static str, variant_index: u32, variant: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize,526 fn serialize_newtype_variant<T: ?Sized>( 527 self, 528 name: &'static str, 529 variant_index: u32, 530 variant: &'static str, 531 value: &T, 532 ) -> Result<Self::Ok, Self::Error> 533 where 534 T: serde::ser::Serialize, 535 { 536 ValueSerializer::new().serialize_newtype_variant(name, variant_index, variant, value) 537 } 538 serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>539 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { 540 ValueSerializer::new().serialize_seq(len) 541 } 542 serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>543 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> { 544 ValueSerializer::new().serialize_tuple(len) 545 } 546 serialize_tuple_struct( self, name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>547 fn serialize_tuple_struct( 548 self, 549 name: &'static str, 550 len: usize, 551 ) -> Result<Self::SerializeTupleStruct, Self::Error> { 552 ValueSerializer::new().serialize_tuple_struct(name, len) 553 } 554 serialize_tuple_variant( self, name: &'static str, variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>555 fn serialize_tuple_variant( 556 self, 557 name: &'static str, 558 variant_index: u32, 559 variant: &'static str, 560 len: usize, 561 ) -> Result<Self::SerializeTupleVariant, Self::Error> { 562 ValueSerializer::new().serialize_tuple_variant(name, variant_index, variant, len) 563 } 564 serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>565 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { 566 ValueSerializer::new().serialize_map(len) 567 } 568 serialize_struct( self, name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Self::Error>569 fn serialize_struct( 570 self, 571 name: &'static str, 572 len: usize, 573 ) -> Result<Self::SerializeStruct, Self::Error> { 574 ValueSerializer::new().serialize_struct(name, len) 575 } 576 serialize_struct_variant( self, name: &'static str, variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>577 fn serialize_struct_variant( 578 self, 579 name: &'static str, 580 variant_index: u32, 581 variant: &'static str, 582 len: usize, 583 ) -> Result<Self::SerializeStructVariant, Self::Error> { 584 ValueSerializer::new().serialize_struct_variant(name, variant_index, variant, len) 585 } 586 } 587 588 pub type SerializeTupleVariant = SerializeVariant<SerializeValueArray>; 589 pub type SerializeStructVariant = SerializeVariant<SerializeMap>; 590 591 pub struct SerializeVariant<T> { 592 variant: &'static str, 593 inner: T, 594 } 595 596 impl SerializeVariant<SerializeValueArray> { tuple(variant: &'static str, len: usize) -> Self597 pub(crate) fn tuple(variant: &'static str, len: usize) -> Self { 598 Self { 599 variant, 600 inner: SerializeValueArray::with_capacity(len), 601 } 602 } 603 } 604 605 impl SerializeVariant<SerializeMap> { struct_(variant: &'static str, len: usize) -> Self606 pub(crate) fn struct_(variant: &'static str, len: usize) -> Self { 607 Self { 608 variant, 609 inner: SerializeMap::table_with_capacity(len), 610 } 611 } 612 } 613 614 impl serde::ser::SerializeTupleVariant for SerializeVariant<SerializeValueArray> { 615 type Ok = crate::Value; 616 type Error = Error; 617 serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> where T: serde::ser::Serialize,618 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Error> 619 where 620 T: serde::ser::Serialize, 621 { 622 serde::ser::SerializeSeq::serialize_element(&mut self.inner, value) 623 } 624 end(self) -> Result<Self::Ok, Self::Error>625 fn end(self) -> Result<Self::Ok, Self::Error> { 626 let inner = serde::ser::SerializeSeq::end(self.inner)?; 627 let mut items = crate::table::KeyValuePairs::new(); 628 let kv = crate::table::TableKeyValue::new( 629 crate::Key::new(self.variant), 630 crate::Item::Value(inner), 631 ); 632 items.insert(crate::InternalString::from(self.variant), kv); 633 Ok(crate::Value::InlineTable(crate::InlineTable::with_pairs( 634 items, 635 ))) 636 } 637 } 638 639 impl serde::ser::SerializeStructVariant for SerializeVariant<SerializeMap> { 640 type Ok = crate::Value; 641 type Error = Error; 642 643 #[inline] serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> where T: serde::ser::Serialize + ?Sized,644 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Self::Error> 645 where 646 T: serde::ser::Serialize + ?Sized, 647 { 648 serde::ser::SerializeStruct::serialize_field(&mut self.inner, key, value) 649 } 650 651 #[inline] end(self) -> Result<Self::Ok, Self::Error>652 fn end(self) -> Result<Self::Ok, Self::Error> { 653 let inner = serde::ser::SerializeStruct::end(self.inner)?; 654 let mut items = crate::table::KeyValuePairs::new(); 655 let kv = crate::table::TableKeyValue::new( 656 crate::Key::new(self.variant), 657 crate::Item::Value(inner), 658 ); 659 items.insert(crate::InternalString::from(self.variant), kv); 660 Ok(crate::Value::InlineTable(crate::InlineTable::with_pairs( 661 items, 662 ))) 663 } 664 } 665