1 // Copyright (c) 2023 Huawei Device Co., Ltd. 2 // Licensed under the Apache License, Version 2.0 (the "License"); 3 // you may not use this file except in compliance with the License. 4 // You may obtain a copy of the License at 5 // 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 use crate::encoder::encode_string_inner; 15 use crate::{Error, Error::*}; 16 use serde::{ser, ser::SerializeSeq, Serialize}; 17 18 /// A data format that can serialize any data structure supported by Serde. 19 struct Serializer<W> 20 where 21 W: std::io::Write, 22 { 23 writer: W, 24 element_num: Vec<usize>, // Used to record the number of traveled elements in the sequence. 25 } 26 27 /// An auxiliary struct which implements Write trait used in 'to_string' function. 28 struct AuxiliaryWriter { 29 output: Vec<u8>, 30 } 31 32 impl std::io::Write for AuxiliaryWriter { write(&mut self, buf: &[u8]) -> std::io::Result<usize>33 fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> { 34 self.output.extend_from_slice(buf); 35 Ok(buf.len()) 36 } 37 flush(&mut self) -> std::io::Result<()>38 fn flush(&mut self) -> std::io::Result<()> { 39 Ok(()) 40 } 41 } 42 43 /// ylong_json::serializer_compact supports two functions to produce as output: 'to_string' and 'to_writer'. 44 /// 45 /// The to_string function serialize an instance which implements the Serialize Trait to a string and return. to_string<T>(value: &T) -> Result<String, Error> where T: Serialize,46 pub fn to_string<T>(value: &T) -> Result<String, Error> 47 where 48 T: Serialize, 49 { 50 let mut writer = AuxiliaryWriter { output: Vec::new() }; 51 to_writer(value, &mut writer)?; 52 Ok(unsafe { String::from_utf8_unchecked(writer.output) }) 53 } 54 55 /// The to_writer function serialize an instance which implements the Serialize Trait and 56 /// writes result into the writer passed in by the user, which needs to implement the std::io::Write. to_writer<T, W>(value: &T, writer: &mut W) -> Result<(), Error> where T: Serialize, W: std::io::Write,57 pub fn to_writer<T, W>(value: &T, writer: &mut W) -> Result<(), Error> 58 where 59 T: Serialize, 60 W: std::io::Write, 61 { 62 let mut serializer = Serializer { 63 writer, 64 element_num: Vec::new(), 65 }; 66 value.serialize(&mut serializer)?; 67 Ok(()) 68 } 69 70 impl<'a, W: std::io::Write> ser::Serializer for &'a mut Serializer<W> { 71 // Using `Ok` to propagate the data structure around simplifies Serializers 72 // which build in-memory data structures. Set 'ok=()' and write the serialization 73 // result to the buffer contained by the instance. 74 type Ok = (); 75 76 // The error type when serializing an instance may occur. 77 type Error = Error; 78 79 // Associative type composite data structures, such as sequences and maps, 80 // used to track other states at serialization time. In this case, no state 81 // is required other than what is already stored in the Serializer struct. 82 type SerializeSeq = Self; 83 type SerializeMap = Self; 84 type SerializeStruct = Self; 85 type SerializeStructVariant = Self; 86 type SerializeTuple = Self; 87 type SerializeTupleStruct = Self; 88 type SerializeTupleVariant = Self; 89 90 // The following 12 methods take one of the base types of the data model 91 // and map it to JSON by appending it to the output string. serialize_bool(self, v: bool) -> Result<(), Error>92 fn serialize_bool(self, v: bool) -> Result<(), Error> { 93 self.writer.write_fmt(format_args!("{v}"))?; 94 Ok(()) 95 } 96 97 // JSON does not distinguish between integers of different sizes, 98 // so all signed integers and all unsigned integers will be serialized in the same way. 99 // Therefore, all integers are converted to 64-bit integers and serialized here. serialize_i8(self, v: i8) -> Result<(), Error>100 fn serialize_i8(self, v: i8) -> Result<(), Error> { 101 self.serialize_i64(i64::from(v)) 102 } 103 serialize_i16(self, v: i16) -> Result<(), Error>104 fn serialize_i16(self, v: i16) -> Result<(), Error> { 105 self.serialize_i64(i64::from(v)) 106 } 107 serialize_i32(self, v: i32) -> Result<(), Error>108 fn serialize_i32(self, v: i32) -> Result<(), Error> { 109 self.serialize_i64(i64::from(v)) 110 } 111 serialize_i64(self, v: i64) -> Result<(), Error>112 fn serialize_i64(self, v: i64) -> Result<(), Error> { 113 self.writer.write_fmt(format_args!("{v}"))?; 114 Ok(()) 115 } 116 serialize_u8(self, v: u8) -> Result<(), Error>117 fn serialize_u8(self, v: u8) -> Result<(), Error> { 118 self.serialize_u64(u64::from(v)) 119 } 120 serialize_u16(self, v: u16) -> Result<(), Error>121 fn serialize_u16(self, v: u16) -> Result<(), Error> { 122 self.serialize_u64(u64::from(v)) 123 } 124 serialize_u32(self, v: u32) -> Result<(), Error>125 fn serialize_u32(self, v: u32) -> Result<(), Error> { 126 self.serialize_u64(u64::from(v)) 127 } 128 serialize_u64(self, v: u64) -> Result<(), Error>129 fn serialize_u64(self, v: u64) -> Result<(), Error> { 130 self.writer.write_fmt(format_args!("{v}"))?; 131 Ok(()) 132 } 133 134 // Same way for floating-point types. serialize_f32(self, v: f32) -> Result<(), Error>135 fn serialize_f32(self, v: f32) -> Result<(), Error> { 136 self.serialize_f64(f64::from(v)) 137 } 138 serialize_f64(self, v: f64) -> Result<(), Error>139 fn serialize_f64(self, v: f64) -> Result<(), Error> { 140 self.writer.write_fmt(format_args!("{v:?}"))?; 141 Ok(()) 142 } 143 serialize_char(self, v: char) -> Result<(), Error>144 fn serialize_char(self, v: char) -> Result<(), Error> { 145 self.serialize_str(v.encode_utf8(&mut [0; 4])) 146 } 147 serialize_str(self, v: &str) -> Result<(), Error>148 fn serialize_str(self, v: &str) -> Result<(), Error> { 149 self.writer.write_all(b"\"")?; 150 encode_string_inner(&mut self.writer, v)?; 151 self.writer.write_all(b"\"")?; 152 Ok(()) 153 } 154 155 // Serialize a byte array into an array of bytes. 156 // Binary formats will typically represent byte arrays more compactly. serialize_bytes(self, v: &[u8]) -> Result<(), Error>157 fn serialize_bytes(self, v: &[u8]) -> Result<(), Error> { 158 let mut seq = self.serialize_seq(Some(v.len()))?; 159 for byte in v { 160 seq.serialize_element(byte)?; 161 } 162 seq.end() 163 } 164 165 // JSON `null` represent an absent optional. serialize_none(self) -> Result<(), Error>166 fn serialize_none(self) -> Result<(), Error> { 167 self.serialize_unit() 168 } 169 170 // Represent an optional instance as the contained value. serialize_some<T>(self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,171 fn serialize_some<T>(self, value: &T) -> Result<(), Error> 172 where 173 T: ?Sized + Serialize, 174 { 175 value.serialize(self) 176 } 177 178 // In Serde, unit represents an anonymous value that does not contain any data. 179 // Map this to JSON as "null". serialize_unit(self) -> Result<(), Error>180 fn serialize_unit(self) -> Result<(), Error> { 181 self.writer.write_all(b"null")?; 182 Ok(()) 183 } 184 185 // Unit struct represents a named value that does not contain any data. Map it to JSON as "null". serialize_unit_struct(self, _name: &'static str) -> Result<(), Error>186 fn serialize_unit_struct(self, _name: &'static str) -> Result<(), Error> { 187 self.serialize_unit() 188 } 189 190 // When serializing a unit variant (or any other kind of variant), formats 191 // can choose whether to track it by index or by name. Binary formats 192 // usually use index while human-readable formats usually use name. serialize_unit_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, ) -> Result<(), Error>193 fn serialize_unit_variant( 194 self, 195 _name: &'static str, 196 _variant_index: u32, 197 variant: &'static str, // The name of the variant. 198 ) -> Result<(), Error> { 199 self.serialize_str(variant) 200 } 201 202 // Treat newtype structs as insignificant wrappers for the data they contain. serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,203 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<(), Error> 204 where 205 T: ?Sized + Serialize, 206 { 207 value.serialize(self) 208 } 209 210 // The newtype variant (and all other variant serialization methods) 211 // specifically refers to the enumerated representation of the "externally tagged". 212 // 213 // Serialize it to JSON with an outer tag of the form '{NAME: VALUE}'. serialize_newtype_variant<T>( self, _name: &'static str, _variant_index: u32, variant: &'static str, value: &T, ) -> Result<(), Error> where T: ?Sized + Serialize,214 fn serialize_newtype_variant<T>( 215 self, 216 _name: &'static str, 217 _variant_index: u32, 218 variant: &'static str, // The name of the variant. 219 value: &T, 220 ) -> Result<(), Error> 221 where 222 T: ?Sized + Serialize, 223 { 224 self.writer.write_all(b"{")?; 225 variant.serialize(&mut *self)?; 226 self.writer.write_all(b":")?; 227 value.serialize(&mut *self)?; 228 self.writer.write_all(b"}")?; 229 Ok(()) 230 } 231 232 // The following is the serialization of compound types. 233 // The start of the sequence, each value, and the end use three separate method calls. 234 // The serializer can be able to support sequences for which the length is unknown up front. 235 // 236 // This one used to serialize the start of the sequence, which in JSON is `[`. serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error>237 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq, Error> { 238 self.element_num.push(0); // Now there is no element in this sequence. 239 self.writer.write_all(b"[")?; 240 Ok(self) 241 } 242 243 // Tuples and sequences are represented similarly in JSON. 244 // Some formats can represent tuples more efficiently by omitting the length. serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error>245 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, Error> { 246 self.serialize_seq(Some(len)) 247 } 248 249 // Tuple and sequences are represented similarly in JSON. serialize_tuple_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeTupleStruct, Error>250 fn serialize_tuple_struct( 251 self, 252 _name: &'static str, 253 len: usize, // The number of data fields that will be serialized. 254 ) -> Result<Self::SerializeTupleStruct, Error> { 255 self.serialize_seq(Some(len)) 256 } 257 258 // Tuple variants are represented in JSON as `{ NAME: [DATA...] }`. 259 // This method used only for the externally tagged representation. serialize_tuple_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeTupleVariant, Error>260 fn serialize_tuple_variant( 261 self, 262 _name: &'static str, 263 _variant_index: u32, 264 variant: &'static str, // The name of the variant. 265 _len: usize, 266 ) -> Result<Self::SerializeTupleVariant, Error> { 267 self.element_num.push(0); 268 self.writer.write_all(b"{")?; 269 variant.serialize(&mut *self)?; 270 self.writer.write_all(b":[")?; 271 Ok(self) 272 } 273 274 // Maps are represented in JSON as `{ K: V, K: V, ... }`. serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error>275 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap, Error> { 276 self.element_num.push(0); 277 self.writer.write_all(b"{")?; 278 Ok(self) 279 } 280 281 // Structs and maps are represented similarly in JSON. serialize_struct( self, _name: &'static str, len: usize, ) -> Result<Self::SerializeStruct, Error>282 fn serialize_struct( 283 self, 284 _name: &'static str, 285 len: usize, // The number of data fields that will be serialized. 286 ) -> Result<Self::SerializeStruct, Error> { 287 self.serialize_map(Some(len)) 288 } 289 290 // Struct variants are represented in JSON as `{ NAME: { K: V, ... } }`. 291 // This used for the externally tagged representation. serialize_struct_variant( self, _name: &'static str, _variant_index: u32, variant: &'static str, _len: usize, ) -> Result<Self::SerializeStructVariant, Error>292 fn serialize_struct_variant( 293 self, 294 _name: &'static str, 295 _variant_index: u32, 296 variant: &'static str, // The name of the variant. 297 _len: usize, 298 ) -> Result<Self::SerializeStructVariant, Error> { 299 self.element_num.push(0); 300 self.writer.write_all(b"{")?; 301 variant.serialize(&mut *self)?; 302 self.writer.write_all(b":{")?; 303 Ok(self) 304 } 305 } 306 307 impl<W> Serializer<W> 308 where 309 W: std::io::Write, 310 { 311 // Serialize a single member of sequence or map. whether_to_add_comma(&mut self) -> Result<(), Error>312 fn whether_to_add_comma(&mut self) -> Result<(), Error> { 313 match self.element_num.last_mut() { 314 None => return Err(IncorrectSerdeUsage), 315 Some(x) => { 316 // This is not the first element, add a comma before the element. 317 if *x > 0 { 318 self.writer.write_all(b",")? 319 }; 320 *x += 1; 321 } 322 } 323 Ok(()) 324 } 325 326 // Add another half of the parentheses at the end. add_another_half(&mut self, buf: &[u8]) -> Result<(), Error>327 fn add_another_half(&mut self, buf: &[u8]) -> Result<(), Error> { 328 self.writer.write_all(buf)?; 329 Ok(()) 330 } 331 } 332 333 // The following 7 impls used to serialize compound types like sequences and maps. 334 // At the beginning of serializing such types, one call of Serializer method. 335 // Next, zero or more calls which serializes a single element of the compound type. 336 // Finally, one call to end the serializing of the compound type. 337 // 338 // This impl is SerializeSeq so these methods are called after calling 'serialize_seq' on Serializer. 339 impl<'a, W: std::io::Write> ser::SerializeSeq for &'a mut Serializer<W> { 340 // Must match the `Ok` type of the serializer. 341 type Ok = (); 342 // Must match the `Error` type of the serializer. 343 type Error = Error; 344 345 // Serialize a single element in the sequence. serialize_element<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,346 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error> 347 where 348 T: ?Sized + Serialize, 349 { 350 self.whether_to_add_comma()?; 351 value.serialize(&mut **self) 352 } 353 354 // Close the sequence. end(self) -> Result<(), Error>355 fn end(self) -> Result<(), Error> { 356 self.element_num.pop(); 357 self.add_another_half(b"]") 358 } 359 } 360 361 // Same thing but for tuples. 362 impl<'a, W: std::io::Write> ser::SerializeTuple for &'a mut Serializer<W> { 363 type Ok = (); 364 type Error = Error; 365 serialize_element<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,366 fn serialize_element<T>(&mut self, value: &T) -> Result<(), Error> 367 where 368 T: ?Sized + Serialize, 369 { 370 self.whether_to_add_comma()?; 371 value.serialize(&mut **self) 372 } 373 end(self) -> Result<(), Error>374 fn end(self) -> Result<(), Error> { 375 self.element_num.pop(); 376 self.add_another_half(b"]") 377 } 378 } 379 380 // Same thing but for tuple structs. 381 impl<'a, W: std::io::Write> ser::SerializeTupleStruct for &'a mut Serializer<W> { 382 type Ok = (); 383 type Error = Error; 384 serialize_field<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,385 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error> 386 where 387 T: ?Sized + Serialize, 388 { 389 self.whether_to_add_comma()?; 390 value.serialize(&mut **self) 391 } 392 end(self) -> Result<(), Error>393 fn end(self) -> Result<(), Error> { 394 self.element_num.pop(); 395 self.add_another_half(b"]") 396 } 397 } 398 399 // The tuple variants are slightly different. Refer back to the 400 // `serialize_tuple_variant` method above: 401 // 402 // self.writer.write_all(b"{"); 403 // variant.serialize(&mut *self)?; 404 // self.writer.write_all(b":["); 405 // 406 // So the `end` method in this impl is responsible for closing 407 // both the `]` and the `}`. 408 impl<'a, W: std::io::Write> ser::SerializeTupleVariant for &'a mut Serializer<W> { 409 type Ok = (); 410 type Error = Error; 411 serialize_field<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,412 fn serialize_field<T>(&mut self, value: &T) -> Result<(), Error> 413 where 414 T: ?Sized + Serialize, 415 { 416 self.whether_to_add_comma()?; 417 value.serialize(&mut **self) 418 } 419 end(self) -> Result<(), Error>420 fn end(self) -> Result<(), Error> { 421 self.element_num.pop(); 422 self.add_another_half(b"]}") 423 } 424 } 425 426 // Some "Serialize" types cannot hold both keys and values 427 // in memory, so the "SerializeMap" implementation needs to 428 // support "serialize_key" and "serialize_value" respectively. 429 // 430 // There is a third optional method on the `SerializeMap` trait. 431 // The 'serialize_entry' method allows the serializer to be optimized 432 // for cases where both keys and values are available. In JSON, it doesn't 433 // make a difference so the default behavior for `serialize_entry` is fine. 434 impl<'a, W: std::io::Write> ser::SerializeMap for &'a mut Serializer<W> { 435 type Ok = (); 436 type Error = Error; 437 438 // The Serde data model allows map keys to be any serializable type. JSON 439 // only allows string keys, so if the key is serialized to something other than a string, 440 // the following implementation will produce invalid JSON. serialize_key<T>(&mut self, key: &T) -> Result<(), Error> where T: ?Sized + Serialize,441 fn serialize_key<T>(&mut self, key: &T) -> Result<(), Error> 442 where 443 T: ?Sized + Serialize, 444 { 445 self.whether_to_add_comma()?; 446 key.serialize(&mut **self) 447 } 448 449 // It makes no difference whether the colon is printed at 450 // the end of 'serialize_key' or at the beginning of 'serialize_value'. 451 // Here we choose to print at the beginning of 'serialize_value'. serialize_value<T>(&mut self, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,452 fn serialize_value<T>(&mut self, value: &T) -> Result<(), Error> 453 where 454 T: ?Sized + Serialize, 455 { 456 self.writer.write_all(b":")?; 457 value.serialize(&mut **self) 458 } 459 end(self) -> Result<(), Error>460 fn end(self) -> Result<(), Error> { 461 self.add_another_half(b"}") 462 } 463 } 464 465 // A structure is like a map where the keys are restricted to a compile-time constant string. 466 impl<'a, W: std::io::Write> ser::SerializeStruct for &'a mut Serializer<W> { 467 type Ok = (); 468 type Error = Error; 469 serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,470 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> 471 where 472 T: ?Sized + Serialize, 473 { 474 self.whether_to_add_comma()?; 475 key.serialize(&mut **self)?; 476 self.writer.write_all(b":")?; 477 value.serialize(&mut **self) 478 } 479 end(self) -> Result<(), Error>480 fn end(self) -> Result<(), Error> { 481 self.element_num.pop(); 482 self.add_another_half(b"}") 483 } 484 } 485 486 // Similar to 'SerializeTupleVariant', the 'end' method here is responsible for 487 // closing two curly braces opened by 'serialize_struct_variant'. 488 impl<'a, W: std::io::Write> ser::SerializeStructVariant for &'a mut Serializer<W> { 489 type Ok = (); 490 type Error = Error; 491 serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> where T: ?Sized + Serialize,492 fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), Error> 493 where 494 T: ?Sized + Serialize, 495 { 496 self.whether_to_add_comma()?; 497 key.serialize(&mut **self)?; 498 self.writer.write_all(b":")?; 499 value.serialize(&mut **self) 500 } 501 end(self) -> Result<(), Error>502 fn end(self) -> Result<(), Error> { 503 self.element_num.pop(); 504 self.add_another_half(b"}}") 505 } 506 } 507 508 #[cfg(test)] 509 mod ut_serializer { 510 use super::*; 511 use std::collections::HashMap; 512 513 /// UT test to serialize simple types. 514 /// 515 /// # Title 516 /// ut_serialize_simple 517 /// 518 /// # Brief 519 /// 1.Uses Serializer::to_string method to serialize simple types. 520 /// 2.Checks if the test results are correct. 521 #[test] ut_serialize_simple()522 fn ut_serialize_simple() { 523 let value: Option<u32> = None; 524 let expected = "null"; 525 assert_eq!(to_string(&value).unwrap(), expected); 526 527 let value: Option<u32> = Some(123); 528 let expected = "123"; 529 assert_eq!(to_string(&value).unwrap(), expected); 530 531 let value = true; 532 let expected = "true"; 533 assert_eq!(to_string(&value).unwrap(), expected); 534 535 let value: i8 = 123; 536 let expected = "123"; 537 assert_eq!(to_string(&value).unwrap(), expected); 538 539 let value: i16 = 123; 540 let expected = "123"; 541 assert_eq!(to_string(&value).unwrap(), expected); 542 543 let value: i32 = 123; 544 let expected = "123"; 545 assert_eq!(to_string(&value).unwrap(), expected); 546 547 let value: i64 = 123; 548 let expected = "123"; 549 assert_eq!(to_string(&value).unwrap(), expected); 550 551 let value: u8 = 123; 552 let expected = "123"; 553 assert_eq!(to_string(&value).unwrap(), expected); 554 555 let value: u16 = 123; 556 let expected = "123"; 557 assert_eq!(to_string(&value).unwrap(), expected); 558 559 let value: u32 = 123; 560 let expected = "123"; 561 assert_eq!(to_string(&value).unwrap(), expected); 562 563 let value: u64 = 123; 564 let expected = "123"; 565 assert_eq!(to_string(&value).unwrap(), expected); 566 567 let value: f32 = 1.0; 568 let expected = "1.0"; 569 assert_eq!(to_string(&value).unwrap(), expected); 570 571 let value: f64 = 1.0; 572 let expected = "1.0"; 573 assert_eq!(to_string(&value).unwrap(), expected); 574 575 let value = "abc"; 576 let expected = "\"abc\""; 577 assert_eq!(to_string(&value).unwrap(), expected); 578 579 let value = b"abc"; 580 let expected = "[97,98,99]"; 581 assert_eq!(to_string(&value).unwrap(), expected); 582 } 583 584 /// UT test to serialize struct 585 /// 586 /// # Title 587 /// ut_serialize_struct 588 /// 589 /// # Brief 590 /// 1.Uses Serializer::to_string method to serialize struct. 591 /// 2.Checks if the test results are correct. 592 #[test] ut_serialize_struct()593 fn ut_serialize_struct() { 594 #[derive(Serialize)] 595 struct TestUnit; 596 let test = TestUnit; 597 let expected = "null"; 598 assert_eq!(to_string(&test).unwrap(), expected); 599 600 #[derive(Serialize)] 601 struct TestNewtype(u32); 602 let test = TestNewtype(123); 603 let expected = "123"; 604 assert_eq!(to_string(&test).unwrap(), expected); 605 606 #[derive(Serialize)] 607 struct TestTuple(u32, u32, bool); 608 let test = TestTuple(123, 321, true); 609 let expected = "[123,321,true]"; 610 assert_eq!(to_string(&test).unwrap(), expected); 611 612 #[derive(Serialize)] 613 struct Test { 614 int: u32, 615 seq: Vec<&'static str>, 616 tup: (i32, i32, i32), 617 } 618 619 let test = Test { 620 int: 1, 621 seq: vec!["a", "b"], 622 tup: (1, 2, 3), 623 }; 624 let expected = r#"{"int":1,"seq":["a","b"],"tup":[1,2,3]}"#; 625 assert_eq!(to_string(&test).unwrap(), expected); 626 } 627 628 /// UT test to serialize enum 629 /// 630 /// # Title 631 /// ut_serialize_enum 632 /// 633 /// # Brief 634 /// 1.Uses Serializer::to_string method to serialize enum. 635 /// 2.Checks if the test results are correct. 636 #[test] ut_serialize_enum()637 fn ut_serialize_enum() { 638 #[derive(Serialize)] 639 enum E { 640 Newtype(i32), 641 Unit, 642 Struct { a: u32 }, 643 Tuple(u32, u32), 644 } 645 646 let n = E::Newtype(-1); 647 let expected = r#"{"Newtype":-1}"#; 648 assert_eq!(to_string(&n).unwrap(), expected); 649 650 let u = E::Unit; 651 let expected = r#""Unit""#; 652 assert_eq!(to_string(&u).unwrap(), expected); 653 654 let s = E::Struct { a: 10 }; 655 let expected = r#"{"Struct":{"a":10}}"#; 656 assert_eq!(to_string(&s).unwrap(), expected); 657 658 let t = E::Tuple(100, 200); 659 let expected = r#"{"Tuple":[100,200]}"#; 660 assert_eq!(to_string(&t).unwrap(), expected); 661 } 662 663 /// UT test to serialize string 664 /// 665 /// # Title 666 /// ut_serialize_string 667 /// 668 /// # Brief 669 /// 1.Uses Serializer::to_string method to serialize string. 670 /// 2.Checks if the test results are correct. 671 #[test] ut_serialize_string()672 fn ut_serialize_string() { 673 let ch = 't'; 674 let expected = r#""t""#; 675 assert_eq!(to_string(&ch).unwrap(), expected); 676 677 let value = String::from("test string."); 678 let expected = r#""test string.""#; 679 assert_eq!(to_string(&value).unwrap(), expected); 680 681 #[cfg(not(feature = "ascii_only"))] 682 { 683 let ch = '中'; 684 let expected = r#""\u4e2d""#; 685 assert_eq!(to_string(&ch).unwrap(), expected); 686 687 let value = String::from("中文测试字符串"); 688 let expected = r#""\u4e2d\u6587\u6d4b\u8bd5\u5b57\u7b26\u4e32""#; 689 assert_eq!(to_string(&value).unwrap(), expected); 690 } 691 } 692 693 /// UT test to serializer object 694 /// 695 /// # Title 696 /// ut_serialize_object 697 /// 698 /// # Brief 699 /// 1.Uses Serializer::to_string method to serialize object. 700 /// 2.Checks if the test results are correct. 701 #[test] ut_serialize_object()702 fn ut_serialize_object() { 703 let mut hash = HashMap::new(); 704 hash.insert("apple", 1); 705 let expected = r#"{"apple":1}"#; 706 assert_eq!(to_string(&hash).unwrap(), expected); 707 hash.insert("banana", 2); 708 assert!(to_string(&hash).is_ok()); 709 } 710 } 711