@@ -95,7 +95,30 @@ pub trait Reader<'de>: Sealed {
9595 }
9696}
9797
98- /// JSON input source that reads from a slice of bytes.
98+ /// JSON input source that reads from a string/bytes-like JSON input.
99+ ///
100+ /// Support most common types: &str, &[u8], &FastStr, &Bytes and &String
101+ ///
102+ /// # Examples
103+ /// ```
104+ /// use bytes::Bytes;
105+ /// use faststr::FastStr;
106+ /// use serde::de::Deserialize;
107+ /// use sonic_rs::{Deserializer, Read};
108+ ///
109+ /// let mut de = Deserializer::new(Read::from(r#"123"#));
110+ /// let num: i32 = Deserialize::deserialize(&mut de).unwrap();
111+ /// assert_eq!(num, 123);
112+ ///
113+ /// let mut de = Deserializer::new(Read::from(r#"123"#.as_bytes()));
114+ /// let num: i32 = Deserialize::deserialize(&mut de).unwrap();
115+ /// assert_eq!(num, 123);
116+ ///
117+ /// let f = FastStr::new("123");
118+ /// let mut de = Deserializer::new(Read::from(&f));
119+ /// let num: i32 = Deserialize::deserialize(&mut de).unwrap();
120+ /// assert_eq!(num, 123);
121+ /// ```
99122pub struct Read < ' a > {
100123 slice : & ' a [ u8 ] ,
101124 pub ( crate ) index : usize ,
@@ -335,8 +358,11 @@ impl<'a> Reader<'a> for PaddedSliceRead<'a> {
335358
336359#[ cfg( test) ]
337360mod test {
338- use super :: * ;
361+ use bytes:: Bytes ;
362+ use faststr:: FastStr ;
339363
364+ use super :: * ;
365+ use crate :: { Deserialize , Deserializer } ;
340366 fn test_peek ( ) {
341367 let data = b"1234567890" ;
342368 let mut reader = Read :: new ( data, false ) ;
@@ -371,4 +397,24 @@ mod test {
371397 test_next ( ) ;
372398 test_index ( ) ;
373399 }
400+
401+ macro_rules! test_deserialize_reader {
402+ ( $json: expr) => {
403+ let mut de = Deserializer :: new( Read :: from( $json) ) ;
404+ let num: i32 = Deserialize :: deserialize( & mut de) . unwrap( ) ;
405+ assert_eq!( num, 123 ) ;
406+ } ;
407+ }
408+
409+ #[ test]
410+ fn test_deserialize ( ) {
411+ let b = Bytes :: from ( r#"123"# ) ;
412+ let f = FastStr :: from ( r#"123"# ) ;
413+ let s = String :: from ( r#"123"# ) ;
414+ test_deserialize_reader ! ( r#"123"# ) ;
415+ test_deserialize_reader ! ( r#"123"# . as_bytes( ) ) ;
416+ test_deserialize_reader ! ( & b) ;
417+ test_deserialize_reader ! ( & f) ;
418+ test_deserialize_reader ! ( & s) ;
419+ }
374420}
0 commit comments