1 use super::Error; 2 3 /// Serialization for TOML [values][crate::Value]. 4 /// 5 /// This structure implements serialization support for TOML to serialize an 6 /// arbitrary type to TOML. Note that the TOML format does not support all 7 /// datatypes in Rust, such as enums, tuples, and tuple structs. These types 8 /// will generate an error when serialized. 9 /// 10 /// Currently a serializer always writes its output to an in-memory `String`, 11 /// which is passed in when creating the serializer itself. 12 /// 13 /// # Examples 14 /// 15 /// ``` 16 /// # #[cfg(feature = "parse")] { 17 /// # #[cfg(feature = "display")] { 18 /// use serde::Serialize; 19 /// 20 /// #[derive(Serialize)] 21 /// struct Config { 22 /// database: Database, 23 /// } 24 /// 25 /// #[derive(Serialize)] 26 /// struct Database { 27 /// ip: String, 28 /// port: Vec<u16>, 29 /// connection_max: u32, 30 /// enabled: bool, 31 /// } 32 /// 33 /// let config = Config { 34 /// database: Database { 35 /// ip: "192.168.1.1".to_string(), 36 /// port: vec![8001, 8002, 8003], 37 /// connection_max: 5000, 38 /// enabled: false, 39 /// }, 40 /// }; 41 /// 42 /// let value = serde::Serialize::serialize( 43 /// &config, 44 /// toml_edit::ser::ValueSerializer::new() 45 /// ).unwrap(); 46 /// println!("{}", value) 47 /// # } 48 /// # } 49 /// ``` 50 #[derive(Default)] 51 #[non_exhaustive] 52 pub struct ValueSerializer {} 53 54 impl ValueSerializer { 55 /// Creates a new serializer generate a TOML document. new() -> Self56 pub fn new() -> Self { 57 Self {} 58 } 59 } 60 61 impl serde::ser::Serializer for ValueSerializer { 62 type Ok = crate::Value; 63 type Error = Error; 64 type SerializeSeq = super::SerializeValueArray; 65 type SerializeTuple = super::SerializeValueArray; 66 type SerializeTupleStruct = super::SerializeValueArray; 67 type SerializeTupleVariant = super::SerializeTupleVariant; 68 type SerializeMap = super::SerializeMap; 69 type SerializeStruct = super::SerializeMap; 70 type SerializeStructVariant = super::SerializeStructVariant; 71 serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error>72 fn serialize_bool(self, v: bool) -> Result<Self::Ok, Self::Error> { 73 Ok(v.into()) 74 } 75 serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error>76 fn serialize_i8(self, v: i8) -> Result<Self::Ok, Self::Error> { 77 self.serialize_i64(v as i64) 78 } 79 serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error>80 fn serialize_i16(self, v: i16) -> Result<Self::Ok, Self::Error> { 81 self.serialize_i64(v as i64) 82 } 83 serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error>84 fn serialize_i32(self, v: i32) -> Result<Self::Ok, Self::Error> { 85 self.serialize_i64(v as i64) 86 } 87 serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error>88 fn serialize_i64(self, v: i64) -> Result<Self::Ok, Self::Error> { 89 Ok(v.into()) 90 } 91 serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error>92 fn serialize_u8(self, v: u8) -> Result<Self::Ok, Self::Error> { 93 self.serialize_i64(v as i64) 94 } 95 serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error>96 fn serialize_u16(self, v: u16) -> Result<Self::Ok, Self::Error> { 97 self.serialize_i64(v as i64) 98 } 99 serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error>100 fn serialize_u32(self, v: u32) -> Result<Self::Ok, Self::Error> { 101 self.serialize_i64(v as i64) 102 } 103 serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error>104 fn serialize_u64(self, v: u64) -> Result<Self::Ok, Self::Error> { 105 let v: i64 = v 106 .try_into() 107 .map_err(|_err| Error::OutOfRange(Some("u64")))?; 108 self.serialize_i64(v) 109 } 110 serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error>111 fn serialize_f32(self, v: f32) -> Result<Self::Ok, Self::Error> { 112 self.serialize_f64(v as f64) 113 } 114 serialize_f64(self, mut v: f64) -> Result<Self::Ok, Self::Error>115 fn serialize_f64(self, mut v: f64) -> Result<Self::Ok, Self::Error> { 116 // Discard sign of NaN when serialized using Serde. 117 // 118 // In all likelihood the sign of NaNs is not meaningful in the user's 119 // program. Ending up with `-nan` in the TOML document would usually be 120 // surprising and undesirable, when the sign of the NaN was not 121 // intentionally controlled by the caller, or may even be 122 // nondeterministic if it comes from arithmetic operations or a cast. 123 if v.is_nan() { 124 v = v.copysign(1.0); 125 } 126 Ok(v.into()) 127 } 128 serialize_char(self, v: char) -> Result<Self::Ok, Self::Error>129 fn serialize_char(self, v: char) -> Result<Self::Ok, Self::Error> { 130 let mut buf = [0; 4]; 131 self.serialize_str(v.encode_utf8(&mut buf)) 132 } 133 serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error>134 fn serialize_str(self, v: &str) -> Result<Self::Ok, Self::Error> { 135 Ok(v.into()) 136 } 137 serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error>138 fn serialize_bytes(self, value: &[u8]) -> Result<Self::Ok, Self::Error> { 139 use serde::ser::Serialize; 140 value.serialize(self) 141 } 142 serialize_none(self) -> Result<Self::Ok, Self::Error>143 fn serialize_none(self) -> Result<Self::Ok, Self::Error> { 144 Err(Error::UnsupportedNone) 145 } 146 serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize + ?Sized,147 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok, Self::Error> 148 where 149 T: serde::ser::Serialize + ?Sized, 150 { 151 value.serialize(self) 152 } 153 serialize_unit(self) -> Result<Self::Ok, Self::Error>154 fn serialize_unit(self) -> Result<Self::Ok, Self::Error> { 155 Err(Error::UnsupportedType(Some("unit"))) 156 } 157 serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error>158 fn serialize_unit_struct(self, name: &'static str) -> Result<Self::Ok, Self::Error> { 159 Err(Error::UnsupportedType(Some(name))) 160 } 161 serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<Self::Ok, Self::Error>162 fn serialize_unit_variant( 163 self, 164 _name: &'static str, 165 _variant_index: u32, 166 variant: &'static str, 167 ) -> Result<Self::Ok, Self::Error> { 168 self.serialize_str(variant) 169 } 170 serialize_newtype_struct<T>( self, _name: &'static str, value: &T, ) -> Result<Self::Ok, Self::Error> where T: serde::ser::Serialize + ?Sized,171 fn serialize_newtype_struct<T>( 172 self, 173 _name: &'static str, 174 value: &T, 175 ) -> Result<Self::Ok, Self::Error> 176 where 177 T: serde::ser::Serialize + ?Sized, 178 { 179 value.serialize(self) 180 } 181 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,182 fn serialize_newtype_variant<T>( 183 self, 184 _name: &'static str, 185 _variant_index: u32, 186 variant: &'static str, 187 value: &T, 188 ) -> Result<Self::Ok, Self::Error> 189 where 190 T: serde::ser::Serialize + ?Sized, 191 { 192 let value = value.serialize(self)?; 193 let mut table = crate::InlineTable::new(); 194 table.insert(variant, value); 195 Ok(table.into()) 196 } 197 serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error>198 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, Self::Error> { 199 let serializer = match len { 200 Some(len) => super::SerializeValueArray::with_capacity(len), 201 None => super::SerializeValueArray::new(), 202 }; 203 Ok(serializer) 204 } 205 serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error>206 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Self::Error> { 207 self.serialize_seq(Some(len)) 208 } 209 serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Self::Error>210 fn serialize_tuple_struct( 211 self, 212 _name: &'static str, 213 len: usize, 214 ) -> Result<Self::SerializeTupleStruct, Self::Error> { 215 self.serialize_seq(Some(len)) 216 } 217 serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeTupleVariant, Self::Error>218 fn serialize_tuple_variant( 219 self, 220 _name: &'static str, 221 _variant_index: u32, 222 variant: &'static str, 223 len: usize, 224 ) -> Result<Self::SerializeTupleVariant, Self::Error> { 225 Ok(super::SerializeTupleVariant::tuple(variant, len)) 226 } 227 serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error>228 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, Self::Error> { 229 let serializer = match len { 230 Some(len) => super::SerializeMap::table_with_capacity(len), 231 None => super::SerializeMap::table(), 232 }; 233 Ok(serializer) 234 } 235 serialize_struct( self, name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Self::Error>236 fn serialize_struct( 237 self, 238 name: &'static str, 239 len: usize, 240 ) -> Result<Self::SerializeStruct, Self::Error> { 241 if name == toml_datetime::__unstable::NAME { 242 Ok(super::SerializeMap::datetime()) 243 } else { 244 self.serialize_map(Some(len)) 245 } 246 } 247 serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, len: usize, ) -> Result<Self::SerializeStructVariant, Self::Error>248 fn serialize_struct_variant( 249 self, 250 _name: &'static str, 251 _variant_index: u32, 252 variant: &'static str, 253 len: usize, 254 ) -> Result<Self::SerializeStructVariant, Self::Error> { 255 Ok(super::SerializeStructVariant::struct_(variant, len)) 256 } 257 } 258