Skip to content

Commit

Permalink
Merge pull request #362 from blyxxyz/optimize-serde-json
Browse files Browse the repository at this point in the history
Use serde-transcode to optimize JSON formatting
  • Loading branch information
ducaale committed Apr 12, 2024
2 parents 4fd1d9d + 034591e commit 14af5b2
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 3 deletions.
10 changes: 10 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ regex-lite = "0.1.5"
roff = { version = "0.2.1", optional = true }
rpassword = "7.2.0"
serde = { version = "1.0", features = ["derive"] }
serde-transcode = "1.1.1"
serde_json = { version = "1.0", features = ["preserve_order"] }
serde_urlencoded = "0.7.0"
termcolor = "1.1.2"
Expand Down
24 changes: 24 additions & 0 deletions src/decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ impl<R: Read> InnerReader<R> {

impl<R: Read> Read for InnerReader<R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.has_errored = false;
match self.reader.read(buf) {
Ok(0) => Ok(0),
Ok(len) => {
Expand Down Expand Up @@ -176,4 +177,27 @@ mod tests {
}
}
}

#[test]
fn interrupts_are_handled_gracefully() {
struct InterruptedReader {
init: bool,
}
impl Read for InterruptedReader {
fn read(&mut self, _buf: &mut [u8]) -> io::Result<usize> {
if !self.init {
self.init = true;
Err(io::Error::new(io::ErrorKind::Interrupted, "interrupted"))
} else {
Ok(0)
}
}
}

let mut base_reader = InterruptedReader { init: false };
let mut reader = decompress(&mut base_reader, Some(CompressionType::Gzip));
let mut buffer = Vec::new();
reader.read_to_end(&mut buffer).unwrap();
assert_eq!(buffer, b"");
}
}
9 changes: 6 additions & 3 deletions src/formatting.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use std::io::{self, Write};

use serde::Serialize;
use syntect::dumps::from_binary;
use syntect::easy::HighlightLines;
use syntect::highlighting::ThemeSet;
Expand All @@ -18,12 +17,16 @@ pub fn get_json_formatter(indent_level: usize) -> jsonxf::Formatter {
fmt
}

/// Format a JSON value using serde. Unlike jsonxf this decodes escaped Unicode values.
///
/// Note that if parsing fails this function will stop midway through and return an error.
/// It should only be used with known-valid JSON.
pub fn serde_json_format(indent_level: usize, text: &str, write: impl Write) -> io::Result<()> {
let indent = " ".repeat(indent_level);
let formatter = serde_json::ser::PrettyFormatter::with_indent(indent.as_bytes());
let value = serde_json::from_str::<serde_json::Value>(text)?;
let mut serializer = serde_json::Serializer::with_formatter(write, formatter);
value.serialize(&mut serializer)?;
let mut deserializer = serde_json::Deserializer::from_str(text);
serde_transcode::transcode(&mut deserializer, &mut serializer)?;
Ok(())
}

Expand Down

0 comments on commit 14af5b2

Please sign in to comment.