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