├── .gitignore ├── examples └── simple.rs ├── Cargo.toml ├── .github └── workflows │ └── rust.yml ├── README.md ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *.swp 2 | /target 3 | **/*.rs.bk 4 | -------------------------------------------------------------------------------- /examples/simple.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | let s = "Hello world"; /* .unwrap() */ 3 | let _ = s.find("wo").unwrap(); 4 | // let _ = s.find("wo").unwrap(); 5 | let _ignore = "s.unwrap();"; 6 | } 7 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "cargo-strict" 3 | version = "0.1.0" 4 | authors = ["Hideo Hattori "] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | walkdir = "2" 9 | memchr = "2.0" 10 | md5 = "0.7" 11 | difflib = "0.4" 12 | chrono = "0.4" 13 | -------------------------------------------------------------------------------- /.github/workflows/rust.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-latest 9 | 10 | steps: 11 | - uses: actions/checkout@v4 12 | - name: Build 13 | run: cargo build --verbose 14 | - name: Clippy 15 | run: cargo clippy --all-features -- -D warnings 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cargo-strict [![build](https://github.com/hhatto/cargo-strict/actions/workflows/rust.yml/badge.svg)](https://github.com/hhatto/cargo-strict/actions/workflows/rust.yml) 2 | 3 | check `unwrap` strict code. 4 | 5 | ## Installation 6 | 7 | ``` 8 | $ cargo install --git https://github.com/hhatto/cargo-strict.git 9 | ``` 10 | 11 | ## Usage 12 | 13 | ``` 14 | $ cargo strict 15 | ``` 16 | 17 | input: 18 | ```rust 19 | $ cat examples/simple.rs 20 | fn main() { 21 | let s = "Hello world"; /* .unwrap() */ 22 | let _ = s.find("wo").unwrap(); 23 | // let _ = s.find("wo").unwrap(); 24 | let ignore = "s.unwrap();"; 25 | } 26 | ``` 27 | 28 | ### Usage as linter 29 | ``` 30 | $ cargo strict 31 | ./examples/simple.rs:2:24: let _ = s.find("wo").unwrap(); 32 | ./src/main.rs:96:36: let input = File::open(filename).unwrap(); 33 | ``` 34 | 35 | ``` 36 | $ cargo strict example/simple.rs 37 | ./examples/simple.rs:2:24: let _ = s.find("wo").unwrap(); 38 | ``` 39 | 40 | ### Usage as formatter 41 | ```diff 42 | $ cargo strict --fix 43 | $ git diff 44 | diff --git a/examples/simple.rs b/examples/simple.rs 45 | index e066898..dbe188b 100644 46 | --- a/examples/simple.rs 47 | +++ b/examples/simple.rs 48 | @@ -1,6 +1,6 @@ 49 | fn main() { 50 | let s = "Hello world"; /* .unwrap() */ 51 | - let _ = s.find("wo").unwrap(); 52 | + let _ = s.find("wo").expect("error-id:5cb0410ba34b040dbbde09dc1991685d"); 53 | // let _ = s.find("wo").unwrap(); 54 | let ignore = "s.unwrap();"; 55 | } 56 | ``` 57 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use chrono::prelude::*; 2 | use std::env; 3 | use std::fs::{metadata, File}; 4 | use std::io::prelude::*; 5 | use std::io::{BufReader, BufWriter}; 6 | use walkdir::WalkDir; 7 | 8 | struct StrictResult { 9 | filename: String, 10 | lineno: usize, 11 | col: usize, 12 | line: String, 13 | } 14 | 15 | const UNWRAP_METHOD: &str = ".unwrap()"; 16 | 17 | impl StrictResult { 18 | fn new(filename: &str, lineno: usize, col: usize, line: &str) -> Self { 19 | Self { 20 | filename: filename.to_string(), 21 | lineno, 22 | col, 23 | line: line.to_string(), 24 | } 25 | } 26 | 27 | fn gen_md5hash(&self) -> md5::Digest { 28 | let key = format!( 29 | "{}_{}_{}_{}", 30 | self.filename, self.lineno, self.col, self.line 31 | ); 32 | md5::compute(key.as_bytes()) 33 | } 34 | } 35 | 36 | fn is_comment_or_string(target_col: usize, target_col_end: usize, line: &str) -> bool { 37 | // check in comment 38 | if let Some(i) = memchr::memchr2(b'/', b'/', line.as_bytes()) { 39 | if (target_col + 1) > i { 40 | return true; 41 | } 42 | } 43 | if let Some(i) = memchr::memchr2(b'/', b'*', line.as_bytes()) { 44 | if (target_col + 1) > i { 45 | return true; 46 | } 47 | } 48 | 49 | // check in string 50 | let line_length = line.len(); 51 | let mut offset = 0; 52 | let mut start = true; 53 | let mut start_col = 0; 54 | let mut string_set: Vec<(usize, usize)> = vec![]; 55 | let bline = line.as_bytes(); 56 | while let Some(v) = memchr::memchr(b'"', &(bline[offset..])) { 57 | if start { 58 | start = false; 59 | } else { 60 | string_set.push((start_col, offset + v)); 61 | start = true 62 | } 63 | start_col += v; 64 | offset += v + 1; 65 | if offset >= line_length { 66 | break; 67 | } 68 | } 69 | for (s, e) in string_set { 70 | if target_col > s && target_col_end < e { 71 | return true; 72 | } 73 | } 74 | 75 | false 76 | } 77 | 78 | fn check_strict(filename: &str, lineno: usize, line: &str) -> Option { 79 | match line.find(UNWRAP_METHOD) { 80 | Some(col) => { 81 | if is_comment_or_string(col, col + UNWRAP_METHOD.len() - 1, line) { 82 | None 83 | } else { 84 | Some(StrictResult::new(filename, lineno + 1, col, line)) 85 | } 86 | } 87 | None => None, 88 | } 89 | } 90 | 91 | fn exec_check(filename: &str) -> Vec { 92 | let mut results = vec![]; 93 | let input = File::open(filename).unwrap_or_else(|_| panic!("fail open file={}", filename)); 94 | let mut buf = BufReader::new(input); 95 | let mut line = String::new(); 96 | let mut lineno: usize = 0; 97 | loop { 98 | match buf.read_line(&mut line) { 99 | Ok(n) => { 100 | if n == 0 { 101 | break; 102 | } 103 | } 104 | Err(e) => panic!("read_line() error: {}", e), 105 | } 106 | if let Some(v) = check_strict(filename, lineno, line.trim_end()) { 107 | results.push(v) 108 | } 109 | line.clear(); 110 | lineno += 1; 111 | } 112 | results 113 | } 114 | 115 | fn file2vecstr(filename: &str) -> Vec { 116 | let mut f = BufReader::new(File::open(filename).expect("file open error")); 117 | let mut line = String::new(); 118 | let mut strs = vec![]; 119 | loop { 120 | match f.read_line(&mut line) { 121 | Ok(n) => { 122 | if n == 0 { 123 | break; 124 | } 125 | } 126 | Err(e) => panic!("read_line() error: {}", e), 127 | } 128 | strs.push(line.clone()); 129 | line.clear(); 130 | } 131 | strs 132 | } 133 | 134 | fn exec_fix_or_diff(result: &StrictResult, is_diff_mode: bool) { 135 | let filename = &result.filename; 136 | let input = File::open(filename).unwrap_or_else(|_| panic!("fail open file={}", filename)); 137 | let output_filename = format!("{}.strictfix", filename); 138 | let output = File::create(output_filename.as_str()).expect("fail create file"); 139 | { 140 | let mut buf = BufReader::new(input); 141 | let mut wbuf = BufWriter::new(output); 142 | let mut line = String::new(); 143 | let mut lineno: usize = 0; 144 | loop { 145 | match buf.read_line(&mut line) { 146 | Ok(n) => { 147 | if n == 0 { 148 | break; 149 | } 150 | } 151 | Err(e) => panic!("read_line() error: {}", e), 152 | } 153 | if lineno == (result).lineno { 154 | let md5 = result.gen_md5hash(); 155 | let ex = format!(".expect(\"error-id:{:x}\")", md5); 156 | let new_line = line.replacen(UNWRAP_METHOD, ex.as_str(), 1); 157 | let _ = wbuf.write(new_line.as_bytes()); 158 | } else { 159 | let _ = wbuf.write(line.as_bytes()); 160 | } 161 | line.clear(); 162 | lineno += 1; 163 | } 164 | } 165 | 166 | if is_diff_mode { 167 | // print diff 168 | let org = file2vecstr(filename); 169 | let orgtime = { 170 | let orgmeta = metadata(filename).expect("get orgfile metadata error"); 171 | let v: DateTime = DateTime::from( 172 | orgmeta 173 | .modified() 174 | .expect("get original file modified time error"), 175 | ); 176 | v.to_rfc2822() 177 | }; 178 | 179 | let fix = file2vecstr(output_filename.as_str()); 180 | let fixtime = { 181 | let fixmeta = metadata(output_filename.as_str()).expect("get fixfile metadata error"); 182 | let v: DateTime = DateTime::from( 183 | fixmeta 184 | .modified() 185 | .expect("get fixed file modified time error"), 186 | ); 187 | v.to_rfc2822() 188 | }; 189 | let diff = difflib::unified_diff( 190 | &org, 191 | &fix, 192 | filename, 193 | output_filename.as_str(), 194 | orgtime.as_str(), 195 | fixtime.as_str(), 196 | 3, 197 | ); 198 | for l in &diff { 199 | print!("{}", l); 200 | } 201 | 202 | // remove tmp file 203 | if let Err(e) = std::fs::remove_file(output_filename.as_str()) { 204 | println!("remove file error: {:?}", e) 205 | } 206 | } else if let Err(e) = std::fs::rename(output_filename.as_str(), filename) { 207 | println!("rename error: {:?}, {} to {}", e, output_filename, filename) 208 | } 209 | } 210 | 211 | fn main() { 212 | // check fix mode 213 | let mut is_fix_mode = false; 214 | let mut is_diff_mode = false; 215 | for arg in env::args() { 216 | if arg.as_str() == "--fix" { 217 | is_fix_mode = true; 218 | } 219 | if arg.as_str() == "--diff" { 220 | is_diff_mode = true; 221 | } 222 | if arg.as_str() == "-h" || arg.as_str() == "--help" { 223 | println!("usage: cargo strict [--fix|--diff] [FILE]"); 224 | std::process::exit(0); 225 | } 226 | } 227 | 228 | if is_diff_mode && is_fix_mode { 229 | println!("usage: cargo strict [--fix|--diff] [FILE]"); 230 | std::process::exit(-1); 231 | } 232 | 233 | let args = env::args().skip(2); 234 | let mut args = args 235 | .filter(|x| x.as_str() != "--fix" && x.as_str() != "--diff") 236 | .collect::>(); 237 | 238 | // walk directory and collect filepath when non args. 239 | if args.is_empty() { 240 | args = vec![]; 241 | for entry in WalkDir::new("./") { 242 | let entry = entry.expect("$2"); 243 | if !entry.file_type().is_file() { 244 | continue; 245 | } 246 | let filepath = entry.path().to_str().expect("#2"); 247 | if !filepath.ends_with(".rs") { 248 | continue; 249 | } 250 | args.push(filepath.to_string()); 251 | } 252 | } 253 | 254 | for arg in args { 255 | let results = exec_check(arg.as_str()); 256 | for result in results { 257 | if is_fix_mode || is_diff_mode { 258 | exec_fix_or_diff(&result, is_diff_mode); 259 | } else { 260 | println!( 261 | "{}:{}:{}: {}", 262 | result.filename, result.lineno, result.col, result.line 263 | ); 264 | } 265 | } 266 | } 267 | } 268 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "android-tzdata" 7 | version = "0.1.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 10 | 11 | [[package]] 12 | name = "android_system_properties" 13 | version = "0.1.5" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 16 | dependencies = [ 17 | "libc", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bumpalo" 28 | version = "3.14.0" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" 31 | 32 | [[package]] 33 | name = "cargo-strict" 34 | version = "0.1.0" 35 | dependencies = [ 36 | "chrono", 37 | "difflib", 38 | "md5", 39 | "memchr", 40 | "walkdir", 41 | ] 42 | 43 | [[package]] 44 | name = "cc" 45 | version = "1.0.83" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" 48 | dependencies = [ 49 | "libc", 50 | ] 51 | 52 | [[package]] 53 | name = "cfg-if" 54 | version = "1.0.0" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 57 | 58 | [[package]] 59 | name = "chrono" 60 | version = "0.4.31" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" 63 | dependencies = [ 64 | "android-tzdata", 65 | "iana-time-zone", 66 | "js-sys", 67 | "num-traits", 68 | "wasm-bindgen", 69 | "windows-targets", 70 | ] 71 | 72 | [[package]] 73 | name = "core-foundation-sys" 74 | version = "0.8.4" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" 77 | 78 | [[package]] 79 | name = "difflib" 80 | version = "0.4.0" 81 | source = "registry+https://github.com/rust-lang/crates.io-index" 82 | checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" 83 | 84 | [[package]] 85 | name = "iana-time-zone" 86 | version = "0.1.58" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" 89 | dependencies = [ 90 | "android_system_properties", 91 | "core-foundation-sys", 92 | "iana-time-zone-haiku", 93 | "js-sys", 94 | "wasm-bindgen", 95 | "windows-core", 96 | ] 97 | 98 | [[package]] 99 | name = "iana-time-zone-haiku" 100 | version = "0.1.2" 101 | source = "registry+https://github.com/rust-lang/crates.io-index" 102 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 103 | dependencies = [ 104 | "cc", 105 | ] 106 | 107 | [[package]] 108 | name = "js-sys" 109 | version = "0.3.66" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" 112 | dependencies = [ 113 | "wasm-bindgen", 114 | ] 115 | 116 | [[package]] 117 | name = "libc" 118 | version = "0.2.150" 119 | source = "registry+https://github.com/rust-lang/crates.io-index" 120 | checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" 121 | 122 | [[package]] 123 | name = "log" 124 | version = "0.4.20" 125 | source = "registry+https://github.com/rust-lang/crates.io-index" 126 | checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" 127 | 128 | [[package]] 129 | name = "md5" 130 | version = "0.7.0" 131 | source = "registry+https://github.com/rust-lang/crates.io-index" 132 | checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771" 133 | 134 | [[package]] 135 | name = "memchr" 136 | version = "2.6.4" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" 139 | 140 | [[package]] 141 | name = "num-traits" 142 | version = "0.2.17" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" 145 | dependencies = [ 146 | "autocfg", 147 | ] 148 | 149 | [[package]] 150 | name = "once_cell" 151 | version = "1.18.0" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" 154 | 155 | [[package]] 156 | name = "proc-macro2" 157 | version = "1.0.70" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" 160 | dependencies = [ 161 | "unicode-ident", 162 | ] 163 | 164 | [[package]] 165 | name = "quote" 166 | version = "1.0.33" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" 169 | dependencies = [ 170 | "proc-macro2", 171 | ] 172 | 173 | [[package]] 174 | name = "same-file" 175 | version = "1.0.6" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" 178 | dependencies = [ 179 | "winapi-util", 180 | ] 181 | 182 | [[package]] 183 | name = "syn" 184 | version = "2.0.39" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" 187 | dependencies = [ 188 | "proc-macro2", 189 | "quote", 190 | "unicode-ident", 191 | ] 192 | 193 | [[package]] 194 | name = "unicode-ident" 195 | version = "1.0.12" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" 198 | 199 | [[package]] 200 | name = "walkdir" 201 | version = "2.4.0" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" 204 | dependencies = [ 205 | "same-file", 206 | "winapi-util", 207 | ] 208 | 209 | [[package]] 210 | name = "wasm-bindgen" 211 | version = "0.2.89" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" 214 | dependencies = [ 215 | "cfg-if", 216 | "wasm-bindgen-macro", 217 | ] 218 | 219 | [[package]] 220 | name = "wasm-bindgen-backend" 221 | version = "0.2.89" 222 | source = "registry+https://github.com/rust-lang/crates.io-index" 223 | checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" 224 | dependencies = [ 225 | "bumpalo", 226 | "log", 227 | "once_cell", 228 | "proc-macro2", 229 | "quote", 230 | "syn", 231 | "wasm-bindgen-shared", 232 | ] 233 | 234 | [[package]] 235 | name = "wasm-bindgen-macro" 236 | version = "0.2.89" 237 | source = "registry+https://github.com/rust-lang/crates.io-index" 238 | checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" 239 | dependencies = [ 240 | "quote", 241 | "wasm-bindgen-macro-support", 242 | ] 243 | 244 | [[package]] 245 | name = "wasm-bindgen-macro-support" 246 | version = "0.2.89" 247 | source = "registry+https://github.com/rust-lang/crates.io-index" 248 | checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" 249 | dependencies = [ 250 | "proc-macro2", 251 | "quote", 252 | "syn", 253 | "wasm-bindgen-backend", 254 | "wasm-bindgen-shared", 255 | ] 256 | 257 | [[package]] 258 | name = "wasm-bindgen-shared" 259 | version = "0.2.89" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" 262 | 263 | [[package]] 264 | name = "winapi" 265 | version = "0.3.9" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 268 | dependencies = [ 269 | "winapi-i686-pc-windows-gnu", 270 | "winapi-x86_64-pc-windows-gnu", 271 | ] 272 | 273 | [[package]] 274 | name = "winapi-i686-pc-windows-gnu" 275 | version = "0.4.0" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 278 | 279 | [[package]] 280 | name = "winapi-util" 281 | version = "0.1.6" 282 | source = "registry+https://github.com/rust-lang/crates.io-index" 283 | checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" 284 | dependencies = [ 285 | "winapi", 286 | ] 287 | 288 | [[package]] 289 | name = "winapi-x86_64-pc-windows-gnu" 290 | version = "0.4.0" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 293 | 294 | [[package]] 295 | name = "windows-core" 296 | version = "0.51.1" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" 299 | dependencies = [ 300 | "windows-targets", 301 | ] 302 | 303 | [[package]] 304 | name = "windows-targets" 305 | version = "0.48.5" 306 | source = "registry+https://github.com/rust-lang/crates.io-index" 307 | checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" 308 | dependencies = [ 309 | "windows_aarch64_gnullvm", 310 | "windows_aarch64_msvc", 311 | "windows_i686_gnu", 312 | "windows_i686_msvc", 313 | "windows_x86_64_gnu", 314 | "windows_x86_64_gnullvm", 315 | "windows_x86_64_msvc", 316 | ] 317 | 318 | [[package]] 319 | name = "windows_aarch64_gnullvm" 320 | version = "0.48.5" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" 323 | 324 | [[package]] 325 | name = "windows_aarch64_msvc" 326 | version = "0.48.5" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" 329 | 330 | [[package]] 331 | name = "windows_i686_gnu" 332 | version = "0.48.5" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" 335 | 336 | [[package]] 337 | name = "windows_i686_msvc" 338 | version = "0.48.5" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" 341 | 342 | [[package]] 343 | name = "windows_x86_64_gnu" 344 | version = "0.48.5" 345 | source = "registry+https://github.com/rust-lang/crates.io-index" 346 | checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" 347 | 348 | [[package]] 349 | name = "windows_x86_64_gnullvm" 350 | version = "0.48.5" 351 | source = "registry+https://github.com/rust-lang/crates.io-index" 352 | checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" 353 | 354 | [[package]] 355 | name = "windows_x86_64_msvc" 356 | version = "0.48.5" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" 359 | --------------------------------------------------------------------------------