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