mirror of
https://github.com/Noratrieb/jsonformat.git
synced 2026-01-14 14:15:03 +01:00
No need to use crate utf8-chars, we can read/write at the byte level
This commit is contained in:
parent
a78e6d3e4b
commit
8832d617a3
3 changed files with 18 additions and 37 deletions
16
Cargo.lock
generated
16
Cargo.lock
generated
|
|
@ -11,12 +11,6 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "arrayvec"
|
|
||||||
version = "0.5.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atty"
|
name = "atty"
|
||||||
version = "0.2.14"
|
version = "0.2.14"
|
||||||
|
|
@ -250,7 +244,6 @@ version = "1.0.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clap",
|
"clap",
|
||||||
"criterion",
|
"criterion",
|
||||||
"utf8-chars",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
@ -528,15 +521,6 @@ version = "0.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "utf8-chars"
|
|
||||||
version = "1.0.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c1348d8face79d019be7cbc0198e36bf93e160ddbfaa7bb54c9592627b9ec841"
|
|
||||||
dependencies = [
|
|
||||||
"arrayvec",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vec_map"
|
name = "vec_map"
|
||||||
version = "0.8.2"
|
version = "0.8.2"
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,6 @@ categories = ["command-line-utilities"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
clap = { version= "2.33.3", optional = true }
|
clap = { version= "2.33.3", optional = true }
|
||||||
utf8-chars = "1.0.0"
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
criterion = "0.3"
|
criterion = "0.3"
|
||||||
|
|
|
||||||
38
src/lib.rs
38
src/lib.rs
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::io::{BufReader, BufWriter, Read, Write};
|
use std::io::{BufReader, BufWriter, Read, Write};
|
||||||
use utf8_chars::BufReadCharsExt;
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Set the indentation used for the formatting.
|
/// Set the indentation used for the formatting.
|
||||||
|
|
@ -56,24 +55,24 @@ where
|
||||||
let mut indent_level = 0usize;
|
let mut indent_level = 0usize;
|
||||||
let mut newline_requested = false; // invalidated if next character is ] or }
|
let mut newline_requested = false; // invalidated if next character is ] or }
|
||||||
|
|
||||||
for char in reader.chars() {
|
for char in reader.bytes() {
|
||||||
let char = char?;
|
let char = char?;
|
||||||
if in_string {
|
if in_string {
|
||||||
let mut escape_here = false;
|
let mut escape_here = false;
|
||||||
match char {
|
match char {
|
||||||
'"' => {
|
b'"' => {
|
||||||
if !escaped {
|
if !escaped {
|
||||||
in_string = false;
|
in_string = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
'\\' => {
|
b'\\' => {
|
||||||
if !escaped {
|
if !escaped {
|
||||||
escape_here = true;
|
escape_here = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
writer.write_all(char.encode_utf8(&mut [0; 4]).as_bytes())?;
|
writer.write_all(&[char])?;
|
||||||
escaped = escape_here;
|
escaped = escape_here;
|
||||||
} else {
|
} else {
|
||||||
let mut auto_push = true;
|
let mut auto_push = true;
|
||||||
|
|
@ -81,44 +80,44 @@ where
|
||||||
let old_level = indent_level;
|
let old_level = indent_level;
|
||||||
|
|
||||||
match char {
|
match char {
|
||||||
'"' => in_string = true,
|
b'"' => in_string = true,
|
||||||
' ' | '\n' | '\t' => continue,
|
b' ' | b'\n' | b'\t' => continue,
|
||||||
'[' => {
|
b'[' => {
|
||||||
indent_level += 1;
|
indent_level += 1;
|
||||||
request_newline = true;
|
request_newline = true;
|
||||||
}
|
}
|
||||||
'{' => {
|
b'{' => {
|
||||||
indent_level += 1;
|
indent_level += 1;
|
||||||
request_newline = true;
|
request_newline = true;
|
||||||
}
|
}
|
||||||
'}' | ']' => {
|
b'}' | b']' => {
|
||||||
indent_level = indent_level.saturating_sub(1);
|
indent_level = indent_level.saturating_sub(1);
|
||||||
if !newline_requested {
|
if !newline_requested {
|
||||||
// see comment below about newline_requested
|
// see comment below about newline_requested
|
||||||
writeln!(writer)?;
|
writer.write_all(&[b'\n'])?;
|
||||||
indent_buffered(writer, indent_level, indentation)?;
|
indent_buffered(writer, indent_level, indentation)?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
':' => {
|
b':' => {
|
||||||
auto_push = false;
|
auto_push = false;
|
||||||
writer.write_all(char.encode_utf8(&mut [0; 4]).as_bytes())?;
|
writer.write_all(&[char])?;
|
||||||
writer.write_all(" ".as_bytes())?;
|
writer.write_all(&[b' '])?;
|
||||||
}
|
}
|
||||||
',' => {
|
b',' => {
|
||||||
request_newline = true;
|
request_newline = true;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
if newline_requested && char != ']' && char != '}' {
|
if newline_requested && char != b']' && char != b'}' {
|
||||||
// newline only happens after { [ and ,
|
// newline only happens after { [ and ,
|
||||||
// this means we can safely assume that it being followed up by } or ]
|
// this means we can safely assume that it being followed up by } or ]
|
||||||
// means an empty object/array
|
// means an empty object/array
|
||||||
writeln!(writer)?;
|
writer.write_all(&[b'\n'])?;
|
||||||
indent_buffered(writer, old_level, indentation)?;
|
indent_buffered(writer, old_level, indentation)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
if auto_push {
|
if auto_push {
|
||||||
writer.write_all(char.encode_utf8(&mut [0; 4]).as_bytes())?;
|
writer.write_all(&[char])?;
|
||||||
}
|
}
|
||||||
|
|
||||||
newline_requested = request_newline;
|
newline_requested = request_newline;
|
||||||
|
|
@ -139,8 +138,7 @@ where
|
||||||
for _ in 0..level {
|
for _ in 0..level {
|
||||||
match indent_str {
|
match indent_str {
|
||||||
Indentation::Default => {
|
Indentation::Default => {
|
||||||
writer.write_all(" ".as_bytes())?;
|
writer.write_all(b" ")?;
|
||||||
writer.write_all(" ".as_bytes())?;
|
|
||||||
}
|
}
|
||||||
Indentation::Custom(indent) => {
|
Indentation::Custom(indent) => {
|
||||||
writer.write_all(indent.as_bytes())?;
|
writer.write_all(indent.as_bytes())?;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue