Mercurial > core / rust/lib/sxp/src/ser.rs
changeset 698: |
96958d3eb5b0 |
parent: |
0ccbbd142694
|
author: |
Richard Westhaver <ellis@rwest.io> |
date: |
Fri, 04 Oct 2024 22:04:59 -0400 |
permissions: |
-rw-r--r-- |
description: |
fixes |
1 //! ser.rs --- SXP Serializer 4 fmt::{DefaultFormatter, WriteFormatter}, 5 tok::{format_escaped_str, format_escaped_str_contents}, 12 use serde::ser::{self, Impossible, Serialize}; 13 use std::io::{self, Write}; 16 pub fn to_writer<W: Write, S: ?Sized + Serialize>( 20 let mut ser = Serializer::new(writer); 21 value.serialize(&mut ser) 24 /// Serialize the given data structure as a canonical SXP byte vector. 26 pub fn to_vec<S: ?Sized + Serialize>(value: &S) -> Result<Vec<u8>> { 27 let mut writer = Vec::with_capacity(128); 28 e!(to_writer(&mut writer, value)); 33 pub fn to_string<S: ?Sized + Serialize>(value: &S) -> Result<String> { 34 let mut writer = Vec::new(); // TODO: with-capacity 128? bench 35 to_writer(&mut writer, value)?; 36 // We then check that the serialized string is the same as what we expect 37 let string = unsafe { String::from_utf8_unchecked(writer) }; 41 pub struct Serializer<W, F = DefaultFormatter> { 46 impl<W: Write> Serializer<W> { 48 fn new(writer: W) -> Self { 49 Serializer::with_formatter(writer, DefaultFormatter) 53 impl<W: Write, F: WriteFormatter> Serializer<W, F> { 54 fn with_formatter(writer: W, formatter: F) -> Self { 55 Serializer { writer, formatter } 58 pub fn into_inner(self) -> W { 62 pub fn serialize_symbol(&mut self, value: &str) -> Result<()> { 65 .write_symbol(&mut self.writer, value) 70 // impl<'a, W:Write> Serializer<W, PrettyFormatter<'a>> {...} 72 impl<'ser, W: Write, F: WriteFormatter> serde::ser::Serializer 73 for &'ser mut Serializer<W, F> 75 type Ok = (); // could be usize for bytes written 77 type SerializeSeq = Seq<'ser, W, F>; 78 type SerializeTuple = Seq<'ser, W, F>; 79 type SerializeTupleStruct = Seq<'ser, W, F>; 80 type SerializeTupleVariant = Seq<'ser, W, F>; 81 type SerializeMap = Seq<'ser, W, F>; 82 type SerializeStruct = Seq<'ser, W, F>; 83 type SerializeStructVariant = Seq<'ser, W, F>; 85 fn serialize_bool(self, v: bool) -> Result<()> { 88 .write_bool(&mut self.writer, v) 92 fn serialize_i8(self, value: i8) -> Result<()> { 95 .write_i8(&mut self.writer, value) 100 fn serialize_i16(self, value: i16) -> Result<()> { 103 .write_i16(&mut self.writer, value) 108 fn serialize_i32(self, value: i32) -> Result<()> { 111 .write_i32(&mut self.writer, value) 116 fn serialize_i64(self, value: i64) -> Result<()> { 119 .write_i64(&mut self.writer, value) 123 fn serialize_i128(self, value: i128) -> Result<()> { 126 .write_i128(&mut self.writer, value) 131 fn serialize_u8(self, value: u8) -> Result<()> { 134 .write_u8(&mut self.writer, value) 139 fn serialize_u16(self, value: u16) -> Result<()> { 142 .write_u16(&mut self.writer, value) 147 fn serialize_u32(self, value: u32) -> Result<()> { 150 .write_u32(&mut self.writer, value) 155 fn serialize_u64(self, value: u64) -> Result<()> { 158 .write_u64(&mut self.writer, value) 162 fn serialize_u128(self, value: u128) -> Result<()> { 165 .write_u128(&mut self.writer, value) 170 fn serialize_f32(self, value: f32) -> Result<()> { 171 match value.classify() { 173 FpCategory::Nan | FpCategory::Infinite => self 175 .write_nil(&mut self.writer) 179 .write_f32(&mut self.writer, value) 184 fn serialize_f64(self, value: f64) -> Result<()> { 185 match value.classify() { 186 FpCategory::Nan | FpCategory::Infinite => self 188 .write_nil(&mut self.writer) 192 .write_f64(&mut self.writer, value) 197 fn serialize_char(self, value: char) -> Result<()> { 198 // A char encoded as UTF-8 takes 4 bytes at most. 199 let mut buf = [0; 4]; 200 self.serialize_str(value.encode_utf8(&mut buf)) 203 fn serialize_str(self, value: &str) -> Result<()> { 204 format_escaped_str(&mut self.writer, &mut self.formatter, value) 208 fn serialize_bytes(self, value: &[u8]) -> Result<()> { 209 use serde::ser::SerializeSeq; 210 let mut seq = e!(self.serialize_seq(Some(value.len()))); 212 e!(seq.serialize_element(byte)); 217 fn serialize_unit(self) -> Result<()> { 220 .write_nil(&mut self.writer) 224 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> { 225 self.serialize_unit() 229 fn serialize_unit_variant( 233 variant: &'static str, 235 self.serialize_symbol(variant) 238 /// Serialize newtypes without an object wrapper. 240 fn serialize_newtype_struct<T>( 246 T: ?Sized + Serialize, 248 value.serialize(self) 252 fn serialize_newtype_variant<T>( 256 variant: &'static str, 260 T: ?Sized + Serialize, 264 .begin_list(&mut self.writer) 265 .map_err(Error::io)); 266 e!(self.serialize_symbol(variant)); 269 // .end_object_key(&mut self.writer) 270 // .map_err(|e| e.into())); 273 // .begin_object_value(&mut self.writer) 274 // .map_err(|e| e.into())); 277 .begin_list_element(&mut self.writer, false) 278 .map_err(Error::io)); 279 e!(value.serialize(&mut *self)); 282 // .end_object_value(&mut self.writer) 283 // .map_err(|e| e.into())); 284 self.formatter.end_list(&mut self.writer).map_err(Error::io) 288 fn serialize_none(self) -> Result<()> { 289 self.serialize_unit() 293 fn serialize_some<T>(self, value: &T) -> Result<()> 295 T: ?Sized + Serialize, 297 value.serialize(self) 301 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> { 302 // TODO: impl nil for seq of 0 length? 305 .begin_list(&mut self.writer) 306 .map_err(Error::io)); 308 e!(self.formatter.end_list(&mut self.writer).map_err(Error::io)); 322 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> { 323 self.serialize_seq(Some(len)) 327 fn serialize_tuple_struct( 331 ) -> Result<Self::SerializeTupleStruct> { 332 self.serialize_seq(Some(len)) 336 fn serialize_tuple_variant( 340 variant: &'static str, 342 ) -> Result<Self::SerializeTupleVariant> { 345 .begin_list(&mut self.writer) 346 .map_err(Error::io)); 347 e!(self.serialize_symbol(variant)); 350 // .end_object_key(&mut self.writer) 351 // .map_err(|e| e.into())); 354 // .begin_object_value(&mut self.writer) 355 // .map_err(|e| e.into())); 358 .begin_list_element(&mut self.writer, false) 359 .map_err(Error::io)); 360 self.serialize_seq(Some(len)) 364 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> { 367 .begin_list(&mut self.writer) 368 .map_err(Error::io)); 370 e!(self.formatter.end_list(&mut self.writer).map_err(Error::io)); 383 // TODO: include struct name? 389 ) -> Result<Self::SerializeStruct> { 390 self.serialize_map(Some(len)) 394 fn serialize_struct_variant( 398 variant: &'static str, 400 ) -> Result<Self::SerializeStructVariant> { 403 .begin_list(&mut self.writer) 404 .map_err(Error::io)); 405 e!(self.serialize_symbol(variant)); 408 .begin_list_element(&mut self.writer, false) 409 .map_err(Error::io)); 412 // .end_object_key(&mut self.writer) 413 // .map_err(|e| e.into())); 416 // .begin_object_value(&mut self.writer) 417 // .map_err(|e| e.into())); 418 self.serialize_map(Some(len)) 421 fn collect_str<T>(self, value: &T) -> Result<()> 425 use self::fmt::Write; 427 struct Adapter<'ser, W: 'ser, F: 'ser> { 429 formatter: &'ser mut F, 430 error: Option<io::Error>, 433 impl<'ser, W, F> Write for Adapter<'ser, W, F> 438 fn write_str(&mut self, s: &str) -> fmt::Result { 439 debug_assert!(self.error.is_none()); 440 match format_escaped_str_contents(self.writer, self.formatter, s) { 443 self.error = Some(err); 452 .begin_string(&mut self.writer) 453 .map_err(Error::io)); 455 let mut adapter = Adapter { 456 writer: &mut self.writer, 457 formatter: &mut self.formatter, 460 match write!(adapter, "{}", value) { 461 Ok(()) => debug_assert!(adapter.error.is_none()), 463 return Err(Error::io( 464 adapter.error.expect("there should be an error"), 471 .end_string(&mut self.writer) 476 // Not public API. Should be pub(crate). 478 #[derive(Eq, PartialEq)] 485 pub struct Seq<'a, W: 'a, F: 'a> { 486 ser: &'a mut Serializer<W, F>, 490 impl<'ser, W: Write, F: WriteFormatter> ser::SerializeSeq for Seq<'ser, W, F> { 494 fn serialize_element<T: ?Sized + Serialize>( 498 let ser = &mut self.ser; 501 .begin_list_element(&mut ser.writer, self.state == State::Car) 502 .map_err(Error::io)); 503 self.state = State::Cdr; 504 e!(value.serialize(&mut **ser)); 507 .end_list_element(&mut ser.writer) 511 fn end(self) -> Result<()> { 513 State::Nil => Ok(()), 517 .end_list(&mut self.ser.writer) 523 impl<'ser, W: Write, F: WriteFormatter> ser::SerializeTuple 529 fn serialize_element<S: ?Sized + Serialize>( 533 ser::SerializeSeq::serialize_element(self, value) 536 fn end(self) -> Result<()> { 537 ser::SerializeSeq::end(self) 541 impl<'a, W, F> ser::SerializeTupleStruct for Seq<'a, W, F> 550 fn serialize_field<T>(&mut self, value: &T) -> Result<()> 552 T: ?Sized + Serialize, 554 ser::SerializeSeq::serialize_element(self, value) 558 fn end(self) -> Result<()> { 560 State::Nil => Ok(()), 564 .end_list(&mut self.ser.writer) 570 .end_list(&mut self.ser.writer) 575 impl<'a, W, F> ser::SerializeTupleVariant for Seq<'a, W, F> 584 fn serialize_field<T>(&mut self, value: &T) -> Result<()> 586 T: ?Sized + Serialize, 588 ser::SerializeSeq::serialize_element(self, value) 591 // TODO 2023-07-09: this don't feel right 593 fn end(self) -> Result<()> { 597 .end_list(&mut self.ser.writer) 598 .map_err(Error::io)); 599 ser::SerializeSeq::end(self) 603 impl<'a, W, F> ser::SerializeMap for Seq<'a, W, F> 612 fn serialize_key<T>(&mut self, key: &T) -> Result<()> 614 T: ?Sized + Serialize, 616 let ser = &mut self.ser; 619 .begin_list_element(&mut ser.writer, self.state == State::Car) 620 .map_err(Error::io)); 621 self.state = State::Cdr; 622 e!(ser.formatter.begin_key(&mut ser.writer).map_err(Error::io)); 623 key.serialize(SymbolSerializer(*ser)) 627 fn serialize_value<T>(&mut self, value: &T) -> Result<()> 629 T: ?Sized + Serialize, 631 let ser = &mut self.ser; 634 .begin_list_element(&mut ser.writer, false) 635 .map_err(Error::io)); 636 e!(value.serialize(&mut **ser)); 639 .end_list_element(&mut ser.writer) 644 fn end(self) -> Result<()> { 648 .end_list(&mut self.ser.writer) 653 impl<'a, W, F> ser::SerializeStruct for Seq<'a, W, F> 662 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()> 664 T: ?Sized + Serialize, 666 ser::SerializeMap::serialize_entry(self, key, value) 670 fn end(self) -> Result<()> { 671 ser::SerializeMap::end(self) 675 impl<'a, W, F> ser::SerializeStructVariant for Seq<'a, W, F> 684 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()> 686 T: ?Sized + Serialize, 691 .begin_key(&mut self.ser.writer) 692 .map_err(Error::io)); 693 e!(self.ser.serialize_symbol(key)); 697 .begin_list_element(&mut self.ser.writer, false) 698 .map_err(Error::io)); 699 value.serialize(&mut *self.ser) 700 //ser::SerializeMap::serialize_entry(self, key, value) 703 fn end(self) -> Result<()> { 709 .end_list(&mut self.ser.writer) 710 .map_err(Error::io)), 715 .end_list(&mut self.ser.writer) 717 // ser::SerializeMap::end(self) 721 fn key_sym_error() -> Error { 722 Error::syntax(ErrorCode::KeyMustBeASymbol, 0, 0) 725 struct SymbolSerializer<'a, W: 'a, F: 'a>(&'a mut Serializer<W, F>); 727 impl<'a, W, F> ser::Serializer for SymbolSerializer<'a, W, F> 736 fn serialize_str(self, value: &str) -> Result<()> { 737 self.0.serialize_symbol(value) 740 fn serialize_unit_variant( 744 variant: &'static str, 746 self.0.serialize_str(variant) 750 fn serialize_newtype_struct<T>( 756 T: ?Sized + Serialize, 758 value.serialize(self) 761 type SerializeSeq = Impossible<(), Error>; 762 type SerializeTuple = Impossible<(), Error>; 763 type SerializeTupleStruct = Impossible<(), Error>; 764 type SerializeTupleVariant = Impossible<(), Error>; 765 type SerializeMap = Impossible<(), Error>; 766 type SerializeStruct = Impossible<(), Error>; 767 type SerializeStructVariant = Impossible<(), Error>; 769 fn serialize_bool(self, _value: bool) -> Result<()> { 773 fn serialize_i8(self, value: i8) -> Result<()> { 777 .begin_string(&mut self.0.writer) 778 .map_err(Error::io)); 782 .write_i8(&mut self.0.writer, value) 783 .map_err(Error::io)); 787 .end_string(&mut self.0.writer) 791 fn serialize_i16(self, value: i16) -> Result<()> { 795 .begin_string(&mut self.0.writer) 796 .map_err(Error::io)); 800 .write_i16(&mut self.0.writer, value) 801 .map_err(Error::io)); 805 .end_string(&mut self.0.writer) 809 fn serialize_i32(self, value: i32) -> Result<()> { 813 .begin_string(&mut self.0.writer) 814 .map_err(Error::io)); 818 .write_i32(&mut self.0.writer, value) 819 .map_err(Error::io)); 823 .end_string(&mut self.0.writer) 827 fn serialize_i64(self, value: i64) -> Result<()> { 831 .begin_string(&mut self.0.writer) 832 .map_err(Error::io)); 836 .write_i64(&mut self.0.writer, value) 837 .map_err(Error::io)); 841 .end_string(&mut self.0.writer) 845 fn serialize_i128(self, value: i128) -> Result<()> { 849 .begin_string(&mut self.0.writer) 850 .map_err(Error::io)); 854 .write_i128(&mut self.0.writer, value) 855 .map_err(Error::io)); 859 .end_string(&mut self.0.writer) 863 fn serialize_u8(self, value: u8) -> Result<()> { 867 .begin_string(&mut self.0.writer) 868 .map_err(Error::io)); 872 .write_u8(&mut self.0.writer, value) 873 .map_err(Error::io)); 877 .end_string(&mut self.0.writer) 881 fn serialize_u16(self, value: u16) -> Result<()> { 885 .begin_string(&mut self.0.writer) 886 .map_err(Error::io)); 890 .write_u16(&mut self.0.writer, value) 891 .map_err(Error::io)); 895 .end_string(&mut self.0.writer) 899 fn serialize_u32(self, value: u32) -> Result<()> { 903 .begin_string(&mut self.0.writer) 904 .map_err(Error::io)); 908 .write_u32(&mut self.0.writer, value) 909 .map_err(Error::io)); 913 .end_string(&mut self.0.writer) 917 fn serialize_u64(self, value: u64) -> Result<()> { 921 .begin_string(&mut self.0.writer) 922 .map_err(Error::io)); 926 .write_u64(&mut self.0.writer, value) 927 .map_err(Error::io)); 931 .end_string(&mut self.0.writer) 935 fn serialize_u128(self, value: u128) -> Result<()> { 939 .begin_string(&mut self.0.writer) 940 .map_err(Error::io)); 944 .write_u128(&mut self.0.writer, value) 945 .map_err(Error::io)); 949 .end_string(&mut self.0.writer) 953 fn serialize_f32(self, _value: f32) -> Result<()> { 957 fn serialize_f64(self, _value: f64) -> Result<()> { 961 fn serialize_char(self, value: char) -> Result<()> { 962 self.0.serialize_str(&value.to_string()) 965 fn serialize_bytes(self, _value: &[u8]) -> Result<()> { 969 fn serialize_unit(self) -> Result<()> { 973 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> { 977 fn serialize_newtype_variant<T>( 981 _variant: &'static str, 985 T: ?Sized + Serialize, 990 fn serialize_none(self) -> Result<()> { 994 fn serialize_some<T>(self, value: &T) -> Result<()> 996 T: ?Sized + Serialize, 998 value.serialize(self) 1001 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> { 1002 Err(key_sym_error()) 1005 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> { 1006 Err(key_sym_error()) 1009 fn serialize_tuple_struct( 1011 _name: &'static str, 1013 ) -> Result<Self::SerializeTupleStruct> { 1014 Err(key_sym_error()) 1017 fn serialize_tuple_variant( 1019 _name: &'static str, 1020 _variant_index: u32, 1021 _variant: &'static str, 1023 ) -> Result<Self::SerializeTupleVariant> { 1024 Err(key_sym_error()) 1027 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> { 1028 Err(key_sym_error()) 1031 fn serialize_struct( 1033 _name: &'static str, 1035 ) -> Result<Self::SerializeStruct> { 1036 Err(key_sym_error()) 1039 fn serialize_struct_variant( 1041 _name: &'static str, 1042 _variant_index: u32, 1043 _variant: &'static str, 1045 ) -> Result<Self::SerializeStructVariant> { 1046 Err(key_sym_error()) 1049 fn collect_str<T>(self, value: &T) -> Result<()> 1051 T: ?Sized + Display, 1053 self.0.collect_str(value)