Skip to content

Commit

Permalink
use std instead of custom reader
Browse files Browse the repository at this point in the history
  • Loading branch information
lovasoa committed Apr 7, 2024
1 parent 2f0b0e6 commit a81ecec
Showing 1 changed file with 4 additions and 63 deletions.
67 changes: 4 additions & 63 deletions src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,15 +213,15 @@ impl<R: Read> Deserializer<R> {
&mut self,
header: Header,
) -> Result<String> {
let mut reader = ReadWithQuotes::new(self.reader_with_limit(header)?);
let mut reader = read_with_quotes(self.reader_with_limit(header)?);
Ok(crate::json::parse_json(&mut reader)?)
}

fn read_json5_compatible_string(
&mut self,
header: Header,
) -> Result<String> {
let mut reader = ReadWithQuotes::new(self.reader_with_limit(header)?);
let mut reader = read_with_quotes(self.reader_with_limit(header)?);
Ok(crate::json::parse_json5(&mut reader)?)
}

Expand Down Expand Up @@ -261,67 +261,8 @@ impl<R: Read> Deserializer<R> {
}
}

/// A reader wrapped that adds double quotes around the original text
struct ReadWithQuotes<R: Read> {
reader: R,
started: bool,
finished: bool,
}

impl<R: Read> ReadWithQuotes<R> {
fn new(reader: R) -> Self {
Self {
reader,
started: false,
finished: false,
}
}
}

impl<R: Read> Read for ReadWithQuotes<R> {
fn read(&mut self, mut buf: &mut [u8]) -> std::io::Result<usize> {
let mut len = 0;

if buf.is_empty() || self.finished {
return Ok(0);
}

if !self.started {
buf[0] = b'"';
self.started = true;
buf = &mut buf[1..];
len = 1;
}

let read = self.reader.read(buf)?;
len += read;
if read < buf.len() {
buf[read] = b'"';
len += 1;
self.finished = true;
}
Ok(len)
}
}

#[test]
fn test_read_with_quotes() {
let input = b"Hello, world!";
let mut buffer = String::new();
ReadWithQuotes::new(&input[..])
.read_to_string(&mut buffer)
.unwrap();
assert_eq!(buffer, "\"Hello, world!\"");
// now harder: read little by little
let mut adapter = ReadWithQuotes::new(&b"x"[..]);
let mut b = [0u8];
adapter.read(&mut b).unwrap();
assert_eq!(b[0], b'"');
adapter.read(&mut b).unwrap();
assert_eq!(b[0], b'x');
adapter.read(&mut b).unwrap();
assert_eq!(b[0], b'"');
assert_eq!(adapter.read(&mut b).unwrap(), 0);
fn read_with_quotes(r: impl Read) -> impl Read {
b"\"".chain(r).chain(&b"\""[..])
}

fn usize_conversion(e: std::num::TryFromIntError) -> Error {
Expand Down

0 comments on commit a81ecec

Please sign in to comment.