Skip to content

Commit

Permalink
feat: support from_reader (#113)
Browse files Browse the repository at this point in the history
  • Loading branch information
CPunisher authored and liuq19 committed Dec 14, 2024
1 parent 6252ed1 commit 53b7a3c
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 5 deletions.
11 changes: 11 additions & 0 deletions examples/serde.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
use std::fs::File;

use sonic_rs::{Deserialize, Serialize};

#[derive(Serialize, Deserialize)]
Expand All @@ -8,6 +10,7 @@ struct Person {
}

fn main() {
// parse a string
let data = r#"{
"name": "Xiaoming",
"age": 18,
Expand All @@ -20,4 +23,12 @@ fn main() {
assert_eq!(p.name, "Xiaoming");
let out = sonic_rs::to_string_pretty(&p).unwrap();
assert_eq!(out, data);

// parse a file reader
let p: Person =
sonic_rs::from_reader(File::open("examples/testdata/person.json").unwrap()).unwrap();
assert_eq!(p.age, 18);
assert_eq!(p.name, "Xiaoming");
let out = sonic_rs::to_string_pretty(&p).unwrap();
assert_eq!(out, data);
}
5 changes: 5 additions & 0 deletions examples/testdata/person.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "Xiaoming",
"age": 18,
"phones": ["+123456"]
}
1 change: 0 additions & 1 deletion src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,6 @@ impl From<Error> for std::io::Error {
pub enum Category {
/// The error was caused by a failure to read or write bytes on an I/O
/// stream.
/// TODO: support stream reader in the future
Io,

/// The error was caused by input that was not syntactically valid JSON.
Expand Down
6 changes: 3 additions & 3 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ pub use crate::lazyvalue::{
pub use crate::pointer::{JsonPointer, PointerNode, PointerTree};
#[doc(inline)]
pub use crate::serde::{
from_slice, from_slice_unchecked, from_str, to_string, to_string_pretty, to_vec, to_vec_pretty,
to_writer, to_writer_pretty, Deserializer, JsonNumberTrait, Number, RawNumber, Serializer,
StreamDeserializer,
from_reader, from_slice, from_slice_unchecked, from_str, to_string, to_string_pretty, to_vec,
to_vec_pretty, to_writer, to_writer_pretty, Deserializer, JsonNumberTrait, Number, RawNumber,
Serializer, StreamDeserializer,
};
#[doc(inline)]
pub use crate::value::{
Expand Down
13 changes: 13 additions & 0 deletions src/serde/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1370,3 +1370,16 @@ where
{
from_trait(Read::new(s.as_bytes(), false))
}

/// Deserialize an instance of type `T` from a Reader
pub fn from_reader<R, T>(mut reader: R) -> Result<T>
where
R: std::io::Read,
T: de::DeserializeOwned,
{
let mut data = Vec::new();
if let Err(e) = reader.read_to_end(&mut data) {
return Err(Error::io(e));
};
from_slice(data.as_slice())
}
4 changes: 3 additions & 1 deletion src/serde/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ pub(crate) mod ser;

pub(crate) use self::de::tri;
pub use self::{
de::{from_slice, from_slice_unchecked, from_str, Deserializer, StreamDeserializer},
de::{
from_reader, from_slice, from_slice_unchecked, from_str, Deserializer, StreamDeserializer,
},
number::{JsonNumberTrait, Number},
rawnumber::RawNumber,
ser::{
Expand Down

0 comments on commit 53b7a3c

Please sign in to comment.