No need to use crate utf8-chars, we can read/write at the byte level

This commit is contained in:
Nicolas Musset 2021-08-22 10:55:24 +09:00
parent a78e6d3e4b
commit 8832d617a3
No known key found for this signature in database
GPG key ID: 090B167B09F29DB2
3 changed files with 18 additions and 37 deletions

16
Cargo.lock generated
View file

@ -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"

View file

@ -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"

View file

@ -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())?;