├── .gitignore ├── .rustfmt.toml ├── CHANGELOG.md ├── Cargo.toml ├── jsonformat-cli ├── Cargo.toml ├── LICENSE ├── README.md └── src │ └── main.rs ├── LICENSE ├── benches └── bench.rs ├── README.md ├── src └── lib.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .idea 3 | *.iml 4 | -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | imports_granularity = "Crate" 2 | newline_style = "Unix" 3 | group_imports = "StdExternalCrate" -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # 2.1.0 2 | 3 | - Strip `\r` from source (https://github.com/Noratrieb/jsonformat/pull/7) 4 | - Various project cleanups 5 | 6 | # 2.0.0 7 | 8 | There are many changes, the two formatting functions have been renamed, `format_reader_writer` now takes 9 | a `W` and `R` instead of `&mut BufReader`, it now always adds a trailing newline. `Indentation::Default` was 10 | renamed to `Indentation::TwoSpaces` and `FourSpaces` and `Tab` were added. There may be a few more 11 | small changes. -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [".", "jsonformat-cli"] 3 | 4 | [package] 5 | name = "jsonformat" 6 | version = "2.1.0" 7 | edition = "2024" 8 | license = "MIT" 9 | description = "Formats JSON extremely fast" 10 | homepage = "https://github.com/Noratrieb/jsonformat" 11 | repository = "https://github.com/Noratrieb/jsonformat" 12 | readme = "README.md" 13 | keywords = ["json", "formatting"] 14 | categories = ["parser-implementations"] 15 | include = ["src/lib.rs", "Cargo.toml", "LICENSE", "README.md", "CHANGELOG.md", "benches/bench.rs"] 16 | 17 | [[bench]] 18 | name = "bench" 19 | harness = false 20 | 21 | [dev-dependencies] 22 | criterion = "0.3.5" 23 | -------------------------------------------------------------------------------- /jsonformat-cli/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "jsonformat-cli" 3 | version = "1.0.0" 4 | edition = "2024" 5 | license = "MIT" 6 | description = "Formats JSON extremely fast" 7 | homepage = "https://github.com/Noratrieb/jsonformat" 8 | repository = "https://github.com/Noratrieb/jsonformat" 9 | readme = "README.md" 10 | keywords = ["json", "formatting", "cli"] 11 | categories = ["command-line-utilities"] 12 | 13 | 14 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 15 | 16 | [dependencies] 17 | jsonformat = { path = "..", version = "2.1.0" } 18 | clap = { version = "3.1.12", features = ["derive"] } 19 | anyhow = "1.0.57" 20 | 21 | [[bin]] 22 | name = "jsonformat" 23 | path = "src/main.rs" 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 nilstrieb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /jsonformat-cli/LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 nilstrieb 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /benches/bench.rs: -------------------------------------------------------------------------------- 1 | use std::{fs, path::PathBuf}; 2 | 3 | use criterion::{black_box, criterion_group, criterion_main, Criterion}; 4 | use jsonformat::{format, format_reader_writer, Indentation}; 5 | 6 | fn criterion_benchmark(c: &mut Criterion) { 7 | // using `include_str` makes the benches a lot less reliable for some reason??? 8 | let file = PathBuf::from(file!()) 9 | .parent() 10 | .unwrap() 11 | .join("large-file.json"); 12 | let file = fs::read_to_string(file).unwrap(); 13 | 14 | c.bench_function("Format json default settings", |b| { 15 | b.iter(|| { 16 | let json = format(black_box(&file), Indentation::TwoSpace); 17 | black_box(json); 18 | }) 19 | }); 20 | 21 | c.bench_function("Format json custom indentation", |b| { 22 | b.iter(|| { 23 | let json = format(black_box(&file), Indentation::Custom("123456")); 24 | black_box(json); 25 | }) 26 | }); 27 | 28 | c.bench_function("Format json no utf8 validation", |b| { 29 | b.iter(|| { 30 | let mut writer = Vec::with_capacity(file.len() * 2); 31 | 32 | format_reader_writer( 33 | black_box(file.as_bytes()), 34 | &mut writer, 35 | Indentation::TwoSpace, 36 | ) 37 | .unwrap(); 38 | black_box(writer); 39 | }) 40 | }); 41 | } 42 | 43 | criterion_group!(benches, criterion_benchmark); 44 | criterion_main!(benches); 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Extremely fast JSON formatter 2 | 3 | `jsonformat` is an extremely fast JSON formatter. 4 | 5 | It formats over 20MB of nested JSON in 60ms. 6 | 7 | ## Library crate 8 | 9 | For the library crate, look at [docs.rs](https://docs.rs/jsonformat) 10 | 11 | ## Binary Install 12 | You need Rust installed on your system 13 | `cargo install jsonformat-cli` 14 | 15 | ## Binary Usage 16 | ``` 17 | jsonformat-cli 0.2.0 18 | Formats JSON extremely fast 19 | 20 | USAGE: 21 | jsonformat [OPTIONS] [INPUT] 22 | 23 | ARGS: 24 | The input file 25 | 26 | OPTIONS: 27 | -h, --help Print help information 28 | -i, --indentation The indentation, s will replaced by a space and t by a tab. 29 | ss is the default 30 | -o, --output The output file 31 | -V, --version Print version information 32 | ``` 33 | 34 | Reads from stdin if no file is supplied. 35 | Outputs to stdout if no output file is specified. 36 | 37 | ## Error handling 38 | `jsonformat` does not report malformed json - it can't even fully know whether the json is actually malformed. 39 | Malformed json is just formatted kind of incorrectly, with no data lost and no crashes. If you find one, open an issue, 40 | 41 | 42 | ## How? 43 | `jsonformat` does not actually parse the json, it just loops through each character and keeps track of some flags. 44 | It then copies these characters to the output buffer, adding and removing whitespace. 45 | -------------------------------------------------------------------------------- /jsonformat-cli/README.md: -------------------------------------------------------------------------------- 1 | # Extremely fast JSON formatter 2 | 3 | `jsonformat` is an extremely fast JSON formatter. 4 | 5 | It formats over 20MB of nested JSON in 60ms. 6 | 7 | ## Library crate 8 | 9 | For the library crate, look at [docs.rs](https://docs.rs/jsonformat) 10 | 11 | ## Binary Install 12 | You need Rust installed on your system 13 | `cargo install jsonformat-cli` 14 | 15 | ## Binary Usage 16 | ``` 17 | jsonformat-cli 0.2.0 18 | Formats JSON extremely fast 19 | 20 | USAGE: 21 | jsonformat [OPTIONS] [INPUT] 22 | 23 | ARGS: 24 | The input file 25 | 26 | OPTIONS: 27 | -h, --help Print help information 28 | -i, --indentation The indentation, s will replaced by a space and t by a tab. 29 | ss is the default 30 | -o, --output The output file 31 | -V, --version Print version information 32 | ``` 33 | 34 | Reads from stdin if no file is supplied. 35 | Outputs to stdout if no output file is specified. 36 | 37 | ## Error handling 38 | `jsonformat` does not report malformed json - it can't even fully know whether the json is actually malformed. 39 | Malformed json is just formatted kind of incorrectly, with no data lost and no crashes. If you find one, open an issue, 40 | 41 | 42 | ## How? 43 | `jsonformat` does not actually parse the json, it just loops through each character and keeps track of some flags. 44 | It then copies these characters to the output buffer, adding and removing whitespace. 45 | -------------------------------------------------------------------------------- /jsonformat-cli/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::{ 2 | fs::File, 3 | io, 4 | io::{BufReader, BufWriter, Read, Write}, 5 | path::PathBuf, 6 | }; 7 | 8 | use anyhow::Context; 9 | use clap::Parser; 10 | use jsonformat::{format_reader_writer, Indentation}; 11 | 12 | #[derive(Parser)] 13 | #[clap(author, about, version)] 14 | struct Options { 15 | /// The indentation, s will replaced by a space and t by a tab. ss is the default. 16 | #[clap(short, long)] 17 | indentation: Option, 18 | #[clap(short, long)] 19 | /// The output file 20 | output: Option, 21 | /// The input file 22 | input: Option, 23 | } 24 | 25 | fn main() -> anyhow::Result<()> { 26 | let options = Options::parse(); 27 | 28 | // Note: on-stack dynamic dispatch 29 | // ugly af but works 30 | let (mut file, stdin, mut stdin_lock); 31 | let reader: &mut dyn Read = match &options.input { 32 | Some(path) => { 33 | file = File::open(path) 34 | .context(format!("Name: {}", path.display())) 35 | .context("Open input file")?; 36 | &mut file 37 | } 38 | None => { 39 | stdin = io::stdin(); 40 | stdin_lock = stdin.lock(); 41 | &mut stdin_lock 42 | } 43 | }; 44 | 45 | let replaced_indent = options.indentation.map(|value| { 46 | value 47 | .to_lowercase() 48 | .chars() 49 | .filter(|c| ['s', 't'].contains(c)) 50 | .collect::() 51 | .replace('s', " ") 52 | .replace('t', "\t") 53 | }); 54 | 55 | let indent = match replaced_indent { 56 | Some(ref str) => Indentation::Custom(str), 57 | None => Indentation::TwoSpace, 58 | }; 59 | 60 | // Note: on-stack dynamic dispatch 61 | let (mut file, stdout, mut stdout_lock); 62 | let writer: &mut dyn Write = match &options.output { 63 | Some(path) => { 64 | file = File::create(path) 65 | .context(path.display().to_string()) 66 | .context("Open output file")?; 67 | &mut file 68 | } 69 | None => { 70 | stdout = io::stdout(); 71 | stdout_lock = stdout.lock(); 72 | &mut stdout_lock 73 | } 74 | }; 75 | 76 | let mut reader = BufReader::new(reader); 77 | let mut writer = BufWriter::new(writer); 78 | format_reader_writer(&mut reader, &mut writer, indent).context("failed to read or write")?; 79 | 80 | Ok(()) 81 | } 82 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | //! jsonformat is a library for formatting json. 2 | //! 3 | //! It does not do anything more than that, which makes it so fast. 4 | 5 | use std::{ 6 | io, 7 | io::{Read, Write}, 8 | }; 9 | 10 | /// Set the indentation used for the formatting. 11 | /// 12 | /// Note: It is *not* recommended to set indentation to anything oder than some spaces or some tabs, 13 | /// but nothing is stopping you from doing that. 14 | #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] 15 | pub enum Indentation<'a> { 16 | /// Fast path for two spaces 17 | TwoSpace, 18 | /// Fast path for four spaces 19 | FourSpace, 20 | /// Fast path for tab 21 | Tab, 22 | /// Use a custom indentation String 23 | Custom(&'a str), 24 | } 25 | 26 | impl Default for Indentation<'_> { 27 | fn default() -> Self { 28 | Self::TwoSpace 29 | } 30 | } 31 | 32 | /// # Formats a json string 33 | /// 34 | /// The indentation can be set to any value using [`Indentation`] 35 | /// The default value is two spaces 36 | /// The default indentation is faster than a custom one 37 | pub fn format(json: &str, indentation: Indentation) -> String { 38 | let mut reader = json.as_bytes(); 39 | let mut writer = Vec::with_capacity(json.len()); 40 | 41 | format_reader_writer(&mut reader, &mut writer, indentation).unwrap(); 42 | String::from_utf8(writer).unwrap() 43 | } 44 | 45 | /// # Formats a json string 46 | /// 47 | /// The indentation can be set to any value using [`Indentation`] 48 | /// The default value is two spaces 49 | /// The default indentation is faster than a custom one 50 | pub fn format_reader_writer( 51 | reader: R, 52 | mut writer: W, 53 | indentation: Indentation, 54 | ) -> io::Result<()> 55 | where 56 | R: Read, 57 | W: Write, 58 | { 59 | let mut escaped = false; 60 | let mut in_string = false; 61 | let mut indent_level = 0usize; 62 | let mut newline_requested = false; // invalidated if next character is ] or } 63 | 64 | for char in reader.bytes() { 65 | let char = char?; 66 | if in_string { 67 | let mut escape_here = false; 68 | match char { 69 | b'"' => { 70 | if !escaped { 71 | in_string = false; 72 | } 73 | } 74 | b'\\' => { 75 | if !escaped { 76 | escape_here = true; 77 | } 78 | } 79 | _ => {} 80 | } 81 | writer.write_all(&[char])?; 82 | escaped = escape_here; 83 | } else { 84 | let mut auto_push = true; 85 | let mut request_newline = false; 86 | let old_level = indent_level; 87 | 88 | match char { 89 | b'"' => in_string = true, 90 | b' ' | b'\n' | b'\r' | b'\t' => continue, 91 | b'[' => { 92 | indent_level += 1; 93 | request_newline = true; 94 | } 95 | b'{' => { 96 | indent_level += 1; 97 | request_newline = true; 98 | } 99 | b'}' | b']' => { 100 | indent_level = indent_level.saturating_sub(1); 101 | if !newline_requested { 102 | // see comment below about newline_requested 103 | writer.write_all(b"\n")?; 104 | indent(&mut writer, indent_level, indentation)?; 105 | } 106 | } 107 | b':' => { 108 | auto_push = false; 109 | writer.write_all(&[char])?; 110 | writer.write_all(&[b' '])?; 111 | } 112 | b',' => { 113 | request_newline = true; 114 | } 115 | _ => {} 116 | } 117 | if newline_requested && char != b']' && char != b'}' { 118 | // newline only happens after { [ and , 119 | // this means we can safely assume that it being followed up by } or ] 120 | // means an empty object/array 121 | writer.write_all(b"\n")?; 122 | indent(&mut writer, old_level, indentation)?; 123 | } 124 | 125 | if auto_push { 126 | writer.write_all(&[char])?; 127 | } 128 | 129 | newline_requested = request_newline; 130 | } 131 | } 132 | 133 | // trailing newline 134 | writer.write_all(b"\n")?; 135 | 136 | Ok(()) 137 | } 138 | 139 | fn indent(writer: &mut W, level: usize, indent_str: Indentation) -> io::Result<()> 140 | where 141 | W: Write, 142 | { 143 | for _ in 0..level { 144 | match indent_str { 145 | Indentation::TwoSpace => { 146 | writer.write_all(b" ")?; 147 | } 148 | Indentation::FourSpace => { 149 | writer.write_all(b" ")?; 150 | } 151 | Indentation::Tab => { 152 | writer.write_all(b"\t")?; 153 | } 154 | Indentation::Custom(indent) => { 155 | writer.write_all(indent.as_bytes())?; 156 | } 157 | } 158 | } 159 | 160 | Ok(()) 161 | } 162 | 163 | #[cfg(test)] 164 | mod test { 165 | use super::*; 166 | 167 | #[test] 168 | fn echoes_primitive() { 169 | let json = "1.35\n"; 170 | assert_eq!(json, format(json, Indentation::TwoSpace)); 171 | } 172 | 173 | #[test] 174 | fn ignore_whitespace_in_string() { 175 | let json = "\" hallo \"\n"; 176 | assert_eq!(json, format(json, Indentation::TwoSpace)); 177 | } 178 | 179 | #[test] 180 | fn remove_leading_whitespace() { 181 | let json = " 0"; 182 | let expected = "0\n"; 183 | assert_eq!(expected, format(json, Indentation::TwoSpace)); 184 | } 185 | 186 | #[test] 187 | fn handle_escaped_strings() { 188 | let json = " \" hallo \\\" \" "; 189 | let expected = "\" hallo \\\" \"\n"; 190 | assert_eq!(expected, format(json, Indentation::TwoSpace)); 191 | } 192 | 193 | #[test] 194 | fn simple_object() { 195 | let json = "{\"a\":0}"; 196 | let expected = "{ 197 | \"a\": 0 198 | } 199 | "; 200 | assert_eq!(expected, format(json, Indentation::TwoSpace)); 201 | } 202 | 203 | #[test] 204 | fn simple_array() { 205 | let json = "[1,2,null]"; 206 | let expected = "[ 207 | 1, 208 | 2, 209 | null 210 | ] 211 | "; 212 | assert_eq!(expected, format(json, Indentation::TwoSpace)); 213 | } 214 | 215 | #[test] 216 | fn array_of_object() { 217 | let json = "[{\"a\": 0}, {}, {\"a\": null}]"; 218 | let expected = "[ 219 | { 220 | \"a\": 0 221 | }, 222 | {}, 223 | { 224 | \"a\": null 225 | } 226 | ] 227 | "; 228 | 229 | assert_eq!(expected, format(json, Indentation::TwoSpace)); 230 | } 231 | 232 | #[test] 233 | fn already_formatted() { 234 | let expected = "[ 235 | { 236 | \"a\": 0 237 | }, 238 | {}, 239 | { 240 | \"a\": null 241 | } 242 | ] 243 | "; 244 | 245 | assert_eq!(expected, format(expected, Indentation::TwoSpace)); 246 | } 247 | 248 | #[test] 249 | fn contains_crlf() { 250 | let json = "[\r\n{\r\n\"a\":0\r\n},\r\n{},\r\n{\r\n\"a\": null\r\n}\r\n]\r\n"; 251 | let expected = "[ 252 | { 253 | \"a\": 0 254 | }, 255 | {}, 256 | { 257 | \"a\": null 258 | } 259 | ] 260 | "; 261 | 262 | assert_eq!(expected, format(json, Indentation::TwoSpace)); 263 | } 264 | } 265 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "aho-corasick" 7 | version = "1.1.3" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 10 | dependencies = [ 11 | "memchr", 12 | ] 13 | 14 | [[package]] 15 | name = "anyhow" 16 | version = "1.0.97" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" 19 | 20 | [[package]] 21 | name = "atty" 22 | version = "0.2.14" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 25 | dependencies = [ 26 | "hermit-abi", 27 | "libc", 28 | "winapi", 29 | ] 30 | 31 | [[package]] 32 | name = "autocfg" 33 | version = "1.4.0" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 36 | 37 | [[package]] 38 | name = "bitflags" 39 | version = "1.3.2" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 42 | 43 | [[package]] 44 | name = "bumpalo" 45 | version = "3.17.0" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 48 | 49 | [[package]] 50 | name = "cast" 51 | version = "0.3.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" 54 | 55 | [[package]] 56 | name = "cfg-if" 57 | version = "1.0.0" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 60 | 61 | [[package]] 62 | name = "clap" 63 | version = "2.34.0" 64 | source = "registry+https://github.com/rust-lang/crates.io-index" 65 | checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" 66 | dependencies = [ 67 | "bitflags", 68 | "textwrap 0.11.0", 69 | "unicode-width", 70 | ] 71 | 72 | [[package]] 73 | name = "clap" 74 | version = "3.2.25" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" 77 | dependencies = [ 78 | "atty", 79 | "bitflags", 80 | "clap_derive", 81 | "clap_lex", 82 | "indexmap", 83 | "once_cell", 84 | "strsim", 85 | "termcolor", 86 | "textwrap 0.16.2", 87 | ] 88 | 89 | [[package]] 90 | name = "clap_derive" 91 | version = "3.2.25" 92 | source = "registry+https://github.com/rust-lang/crates.io-index" 93 | checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" 94 | dependencies = [ 95 | "heck", 96 | "proc-macro-error", 97 | "proc-macro2", 98 | "quote", 99 | "syn 1.0.109", 100 | ] 101 | 102 | [[package]] 103 | name = "clap_lex" 104 | version = "0.2.4" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" 107 | dependencies = [ 108 | "os_str_bytes", 109 | ] 110 | 111 | [[package]] 112 | name = "criterion" 113 | version = "0.3.6" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f" 116 | dependencies = [ 117 | "atty", 118 | "cast", 119 | "clap 2.34.0", 120 | "criterion-plot", 121 | "csv", 122 | "itertools", 123 | "lazy_static", 124 | "num-traits", 125 | "oorandom", 126 | "plotters", 127 | "rayon", 128 | "regex", 129 | "serde", 130 | "serde_cbor", 131 | "serde_derive", 132 | "serde_json", 133 | "tinytemplate", 134 | "walkdir", 135 | ] 136 | 137 | [[package]] 138 | name = "criterion-plot" 139 | version = "0.4.5" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876" 142 | dependencies = [ 143 | "cast", 144 | "itertools", 145 | ] 146 | 147 | [[package]] 148 | name = "crossbeam-deque" 149 | version = "0.8.6" 150 | source = "registry+https://github.com/rust-lang/crates.io-index" 151 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 152 | dependencies = [ 153 | "crossbeam-epoch", 154 | "crossbeam-utils", 155 | ] 156 | 157 | [[package]] 158 | name = "crossbeam-epoch" 159 | version = "0.9.18" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 162 | dependencies = [ 163 | "crossbeam-utils", 164 | ] 165 | 166 | [[package]] 167 | name = "crossbeam-utils" 168 | version = "0.8.21" 169 | source = "registry+https://github.com/rust-lang/crates.io-index" 170 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 171 | 172 | [[package]] 173 | name = "csv" 174 | version = "1.3.1" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "acdc4883a9c96732e4733212c01447ebd805833b7275a73ca3ee080fd77afdaf" 177 | dependencies = [ 178 | "csv-core", 179 | "itoa", 180 | "ryu", 181 | "serde", 182 | ] 183 | 184 | [[package]] 185 | name = "csv-core" 186 | version = "0.1.12" 187 | source = "registry+https://github.com/rust-lang/crates.io-index" 188 | checksum = "7d02f3b0da4c6504f86e9cd789d8dbafab48c2321be74e9987593de5a894d93d" 189 | dependencies = [ 190 | "memchr", 191 | ] 192 | 193 | [[package]] 194 | name = "either" 195 | version = "1.15.0" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 198 | 199 | [[package]] 200 | name = "half" 201 | version = "1.8.3" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" 204 | 205 | [[package]] 206 | name = "hashbrown" 207 | version = "0.12.3" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 210 | 211 | [[package]] 212 | name = "heck" 213 | version = "0.4.1" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" 216 | 217 | [[package]] 218 | name = "hermit-abi" 219 | version = "0.1.19" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 222 | dependencies = [ 223 | "libc", 224 | ] 225 | 226 | [[package]] 227 | name = "indexmap" 228 | version = "1.9.3" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" 231 | dependencies = [ 232 | "autocfg", 233 | "hashbrown", 234 | ] 235 | 236 | [[package]] 237 | name = "itertools" 238 | version = "0.10.5" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 241 | dependencies = [ 242 | "either", 243 | ] 244 | 245 | [[package]] 246 | name = "itoa" 247 | version = "1.0.15" 248 | source = "registry+https://github.com/rust-lang/crates.io-index" 249 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 250 | 251 | [[package]] 252 | name = "js-sys" 253 | version = "0.3.77" 254 | source = "registry+https://github.com/rust-lang/crates.io-index" 255 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 256 | dependencies = [ 257 | "once_cell", 258 | "wasm-bindgen", 259 | ] 260 | 261 | [[package]] 262 | name = "jsonformat" 263 | version = "2.1.0" 264 | dependencies = [ 265 | "criterion", 266 | ] 267 | 268 | [[package]] 269 | name = "jsonformat-cli" 270 | version = "1.0.0" 271 | dependencies = [ 272 | "anyhow", 273 | "clap 3.2.25", 274 | "jsonformat", 275 | ] 276 | 277 | [[package]] 278 | name = "lazy_static" 279 | version = "1.5.0" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 282 | 283 | [[package]] 284 | name = "libc" 285 | version = "0.2.171" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" 288 | 289 | [[package]] 290 | name = "log" 291 | version = "0.4.26" 292 | source = "registry+https://github.com/rust-lang/crates.io-index" 293 | checksum = "30bde2b3dc3671ae49d8e2e9f044c7c005836e7a023ee57cffa25ab82764bb9e" 294 | 295 | [[package]] 296 | name = "memchr" 297 | version = "2.7.4" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 300 | 301 | [[package]] 302 | name = "num-traits" 303 | version = "0.2.19" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 306 | dependencies = [ 307 | "autocfg", 308 | ] 309 | 310 | [[package]] 311 | name = "once_cell" 312 | version = "1.21.1" 313 | source = "registry+https://github.com/rust-lang/crates.io-index" 314 | checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" 315 | 316 | [[package]] 317 | name = "oorandom" 318 | version = "11.1.5" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" 321 | 322 | [[package]] 323 | name = "os_str_bytes" 324 | version = "6.6.1" 325 | source = "registry+https://github.com/rust-lang/crates.io-index" 326 | checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" 327 | 328 | [[package]] 329 | name = "plotters" 330 | version = "0.3.7" 331 | source = "registry+https://github.com/rust-lang/crates.io-index" 332 | checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" 333 | dependencies = [ 334 | "num-traits", 335 | "plotters-backend", 336 | "plotters-svg", 337 | "wasm-bindgen", 338 | "web-sys", 339 | ] 340 | 341 | [[package]] 342 | name = "plotters-backend" 343 | version = "0.3.7" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" 346 | 347 | [[package]] 348 | name = "plotters-svg" 349 | version = "0.3.7" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" 352 | dependencies = [ 353 | "plotters-backend", 354 | ] 355 | 356 | [[package]] 357 | name = "proc-macro-error" 358 | version = "1.0.4" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 361 | dependencies = [ 362 | "proc-macro-error-attr", 363 | "proc-macro2", 364 | "quote", 365 | "syn 1.0.109", 366 | "version_check", 367 | ] 368 | 369 | [[package]] 370 | name = "proc-macro-error-attr" 371 | version = "1.0.4" 372 | source = "registry+https://github.com/rust-lang/crates.io-index" 373 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 374 | dependencies = [ 375 | "proc-macro2", 376 | "quote", 377 | "version_check", 378 | ] 379 | 380 | [[package]] 381 | name = "proc-macro2" 382 | version = "1.0.94" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" 385 | dependencies = [ 386 | "unicode-ident", 387 | ] 388 | 389 | [[package]] 390 | name = "quote" 391 | version = "1.0.40" 392 | source = "registry+https://github.com/rust-lang/crates.io-index" 393 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 394 | dependencies = [ 395 | "proc-macro2", 396 | ] 397 | 398 | [[package]] 399 | name = "rayon" 400 | version = "1.10.0" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 403 | dependencies = [ 404 | "either", 405 | "rayon-core", 406 | ] 407 | 408 | [[package]] 409 | name = "rayon-core" 410 | version = "1.12.1" 411 | source = "registry+https://github.com/rust-lang/crates.io-index" 412 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 413 | dependencies = [ 414 | "crossbeam-deque", 415 | "crossbeam-utils", 416 | ] 417 | 418 | [[package]] 419 | name = "regex" 420 | version = "1.11.1" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 423 | dependencies = [ 424 | "aho-corasick", 425 | "memchr", 426 | "regex-automata", 427 | "regex-syntax", 428 | ] 429 | 430 | [[package]] 431 | name = "regex-automata" 432 | version = "0.4.9" 433 | source = "registry+https://github.com/rust-lang/crates.io-index" 434 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 435 | dependencies = [ 436 | "aho-corasick", 437 | "memchr", 438 | "regex-syntax", 439 | ] 440 | 441 | [[package]] 442 | name = "regex-syntax" 443 | version = "0.8.5" 444 | source = "registry+https://github.com/rust-lang/crates.io-index" 445 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 446 | 447 | [[package]] 448 | name = "rustversion" 449 | version = "1.0.20" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 452 | 453 | [[package]] 454 | name = "ryu" 455 | version = "1.0.20" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 458 | 459 | [[package]] 460 | name = "same-file" 461 | version = "1.0.6" 462 | source = "registry+https://github.com/rust-lang/crates.io-index" 463 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 464 | dependencies = [ 465 | "winapi-util", 466 | ] 467 | 468 | [[package]] 469 | name = "serde" 470 | version = "1.0.219" 471 | source = "registry+https://github.com/rust-lang/crates.io-index" 472 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 473 | dependencies = [ 474 | "serde_derive", 475 | ] 476 | 477 | [[package]] 478 | name = "serde_cbor" 479 | version = "0.11.2" 480 | source = "registry+https://github.com/rust-lang/crates.io-index" 481 | checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" 482 | dependencies = [ 483 | "half", 484 | "serde", 485 | ] 486 | 487 | [[package]] 488 | name = "serde_derive" 489 | version = "1.0.219" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 492 | dependencies = [ 493 | "proc-macro2", 494 | "quote", 495 | "syn 2.0.100", 496 | ] 497 | 498 | [[package]] 499 | name = "serde_json" 500 | version = "1.0.140" 501 | source = "registry+https://github.com/rust-lang/crates.io-index" 502 | checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 503 | dependencies = [ 504 | "itoa", 505 | "memchr", 506 | "ryu", 507 | "serde", 508 | ] 509 | 510 | [[package]] 511 | name = "strsim" 512 | version = "0.10.0" 513 | source = "registry+https://github.com/rust-lang/crates.io-index" 514 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 515 | 516 | [[package]] 517 | name = "syn" 518 | version = "1.0.109" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 521 | dependencies = [ 522 | "proc-macro2", 523 | "quote", 524 | "unicode-ident", 525 | ] 526 | 527 | [[package]] 528 | name = "syn" 529 | version = "2.0.100" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 532 | dependencies = [ 533 | "proc-macro2", 534 | "quote", 535 | "unicode-ident", 536 | ] 537 | 538 | [[package]] 539 | name = "termcolor" 540 | version = "1.4.1" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" 543 | dependencies = [ 544 | "winapi-util", 545 | ] 546 | 547 | [[package]] 548 | name = "textwrap" 549 | version = "0.11.0" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" 552 | dependencies = [ 553 | "unicode-width", 554 | ] 555 | 556 | [[package]] 557 | name = "textwrap" 558 | version = "0.16.2" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" 561 | 562 | [[package]] 563 | name = "tinytemplate" 564 | version = "1.2.1" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" 567 | dependencies = [ 568 | "serde", 569 | "serde_json", 570 | ] 571 | 572 | [[package]] 573 | name = "unicode-ident" 574 | version = "1.0.18" 575 | source = "registry+https://github.com/rust-lang/crates.io-index" 576 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 577 | 578 | [[package]] 579 | name = "unicode-width" 580 | version = "0.1.14" 581 | source = "registry+https://github.com/rust-lang/crates.io-index" 582 | checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 583 | 584 | [[package]] 585 | name = "version_check" 586 | version = "0.9.5" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 589 | 590 | [[package]] 591 | name = "walkdir" 592 | version = "2.5.0" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" 595 | dependencies = [ 596 | "same-file", 597 | "winapi-util", 598 | ] 599 | 600 | [[package]] 601 | name = "wasm-bindgen" 602 | version = "0.2.100" 603 | source = "registry+https://github.com/rust-lang/crates.io-index" 604 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 605 | dependencies = [ 606 | "cfg-if", 607 | "once_cell", 608 | "rustversion", 609 | "wasm-bindgen-macro", 610 | ] 611 | 612 | [[package]] 613 | name = "wasm-bindgen-backend" 614 | version = "0.2.100" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 617 | dependencies = [ 618 | "bumpalo", 619 | "log", 620 | "proc-macro2", 621 | "quote", 622 | "syn 2.0.100", 623 | "wasm-bindgen-shared", 624 | ] 625 | 626 | [[package]] 627 | name = "wasm-bindgen-macro" 628 | version = "0.2.100" 629 | source = "registry+https://github.com/rust-lang/crates.io-index" 630 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 631 | dependencies = [ 632 | "quote", 633 | "wasm-bindgen-macro-support", 634 | ] 635 | 636 | [[package]] 637 | name = "wasm-bindgen-macro-support" 638 | version = "0.2.100" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 641 | dependencies = [ 642 | "proc-macro2", 643 | "quote", 644 | "syn 2.0.100", 645 | "wasm-bindgen-backend", 646 | "wasm-bindgen-shared", 647 | ] 648 | 649 | [[package]] 650 | name = "wasm-bindgen-shared" 651 | version = "0.2.100" 652 | source = "registry+https://github.com/rust-lang/crates.io-index" 653 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 654 | dependencies = [ 655 | "unicode-ident", 656 | ] 657 | 658 | [[package]] 659 | name = "web-sys" 660 | version = "0.3.77" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 663 | dependencies = [ 664 | "js-sys", 665 | "wasm-bindgen", 666 | ] 667 | 668 | [[package]] 669 | name = "winapi" 670 | version = "0.3.9" 671 | source = "registry+https://github.com/rust-lang/crates.io-index" 672 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 673 | dependencies = [ 674 | "winapi-i686-pc-windows-gnu", 675 | "winapi-x86_64-pc-windows-gnu", 676 | ] 677 | 678 | [[package]] 679 | name = "winapi-i686-pc-windows-gnu" 680 | version = "0.4.0" 681 | source = "registry+https://github.com/rust-lang/crates.io-index" 682 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 683 | 684 | [[package]] 685 | name = "winapi-util" 686 | version = "0.1.9" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" 689 | dependencies = [ 690 | "windows-sys", 691 | ] 692 | 693 | [[package]] 694 | name = "winapi-x86_64-pc-windows-gnu" 695 | version = "0.4.0" 696 | source = "registry+https://github.com/rust-lang/crates.io-index" 697 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 698 | 699 | [[package]] 700 | name = "windows-sys" 701 | version = "0.59.0" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 704 | dependencies = [ 705 | "windows-targets", 706 | ] 707 | 708 | [[package]] 709 | name = "windows-targets" 710 | version = "0.52.6" 711 | source = "registry+https://github.com/rust-lang/crates.io-index" 712 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 713 | dependencies = [ 714 | "windows_aarch64_gnullvm", 715 | "windows_aarch64_msvc", 716 | "windows_i686_gnu", 717 | "windows_i686_gnullvm", 718 | "windows_i686_msvc", 719 | "windows_x86_64_gnu", 720 | "windows_x86_64_gnullvm", 721 | "windows_x86_64_msvc", 722 | ] 723 | 724 | [[package]] 725 | name = "windows_aarch64_gnullvm" 726 | version = "0.52.6" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 729 | 730 | [[package]] 731 | name = "windows_aarch64_msvc" 732 | version = "0.52.6" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 735 | 736 | [[package]] 737 | name = "windows_i686_gnu" 738 | version = "0.52.6" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 741 | 742 | [[package]] 743 | name = "windows_i686_gnullvm" 744 | version = "0.52.6" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 747 | 748 | [[package]] 749 | name = "windows_i686_msvc" 750 | version = "0.52.6" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 753 | 754 | [[package]] 755 | name = "windows_x86_64_gnu" 756 | version = "0.52.6" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 759 | 760 | [[package]] 761 | name = "windows_x86_64_gnullvm" 762 | version = "0.52.6" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 765 | 766 | [[package]] 767 | name = "windows_x86_64_msvc" 768 | version = "0.52.6" 769 | source = "registry+https://github.com/rust-lang/crates.io-index" 770 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 771 | --------------------------------------------------------------------------------