├── .gitignore ├── .dev.env ├── assets ├── usage.gif └── tactics-trainer.png ├── Cargo.toml ├── README.md ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.dev.env: -------------------------------------------------------------------------------- 1 | TACTICS_SERVER_URL=http://localhost:4300 2 | -------------------------------------------------------------------------------- /assets/usage.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcusbuffett/chess-tactics-cli/HEAD/assets/usage.gif -------------------------------------------------------------------------------- /assets/tactics-trainer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marcusbuffett/chess-tactics-cli/HEAD/assets/tactics-trainer.png -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "tactics-trainer-cli" 3 | version = "1.0.2" 4 | edition = "2018" 5 | 6 | description = "Train chess tactics in your terminal" 7 | homepage = "https://github.com/marcusbuffett/chess-tactics-cli" 8 | repository = "https://github.com/marcusbuffett/chess-tactics-cli" 9 | keywords = ["cli", "chess"] 10 | license = "MIT" 11 | 12 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 13 | 14 | [dependencies] 15 | anyhow = "1.0.40" 16 | colored = "2.0.0" 17 | reqwest = {version = "0.11.3", features = ["json"] } 18 | rprompt = "1.0.5" 19 | serde = { version = "1.0.125", features = ["derive"] } 20 | serde_json = "1.0.64" 21 | tokio = { version = "1.5.0", features = ["full"] } 22 | shakmaty = "0.19.0" 23 | clap = {version = "3.0.1", features = ["derive"]} 24 | prettytable-rs = "0.8.0" 25 | 26 | [[bin]] 27 | name = "tactics-trainer" 28 | path = "src/main.rs" 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 |
5 |

6 | 7 |

Chess Tactics CLI

8 |

9 | 10 | 11 | 12 | ![Screen shot](./assets/usage.gif) 13 | 14 | Practice some chess tactics in your terminal while you wait for your code to 15 | compile. Fetches tactics from [Chess Madra](https://chessmadra.com). 16 | 17 | 18 | ### Built With 19 | 20 | * Rust 21 | * [The Lichess Puzzles Database](https://database.lichess.org/#puzzles) 22 | * [Shakmaty](https://github.com/niklasf/shakmaty) 23 | 24 | ## Installation 25 | 26 | ```sh 27 | cargo install tactics-trainer-cli 28 | ``` 29 | 30 | 31 | ## Usage 32 | 33 | Usage is straightforward, just run `tactics-trainer` 34 | 35 | ```sh 36 | tactics-trainer 37 | ``` 38 | Or specify some tags (See [this 39 | file](https://github.com/ornicar/lila/blob/master/translation/source/puzzleTheme.xml) for all tags): 40 | ```sh 41 | tactics-trainer --tags mateIn1 42 | ``` 43 | 44 | Or specify a rating range: 45 | ```sh 46 | tactics-trainer --rating=600-1200 47 | ``` 48 | 49 | 50 | ## Roadmap 51 | 52 | - [ ] Sessions 53 | - [ ] Spaced repetition of failed puzzles 54 | - [ ] AND queries for themes 55 | 56 | 57 | ## License 58 | 59 | Distributed under the MIT License. See `LICENSE` for more information. 60 | 61 | 62 | 63 | ## Contact 64 | 65 | Marcus Bufett - [@marcusbuffett](https://twitter.com/marcusbuffett) - me@mbuffett.com 66 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | #[macro_use] 3 | extern crate anyhow; 4 | #[macro_use] 5 | extern crate prettytable; 6 | 7 | use anyhow::Context; 8 | use clap::{AppSettings, Parser}; 9 | use colored::*; 10 | use serde::{Deserialize, Serialize}; 11 | use shakmaty::{ 12 | fen::{self, Fen}, 13 | san::{self, San}, 14 | uci::Uci, 15 | Board, CastlingMode, Chess, Color, Move, Piece, Position, Role, Setup, Square, 16 | }; 17 | 18 | use anyhow::Result; 19 | 20 | #[derive(Parser, Debug)] 21 | #[clap(version = "1.0", author = "Marcus B. ")] 22 | #[clap(setting = AppSettings::ColoredHelp)] 23 | struct Args { 24 | #[clap(short, long)] 25 | /// The rating range of the tactics to fetch. Try 0-1200 for easy, 1200-1800 for 26 | /// intermediate, or 1800-3000 for difficult tactics. 27 | rating: Option, 28 | #[clap(short, long)] 29 | /// Optionally specify a list of tags to get tactics for. Every tactic returned will have one 30 | /// of these tags 31 | tags: Vec, 32 | } 33 | 34 | #[tokio::main] 35 | async fn main() -> Result<()> { 36 | let opts = Args::parse(); 37 | // dbg!(&opts); 38 | let (rating_lower_bound, rating_upper_bound): (Option, Option) = { 39 | match opts.rating { 40 | Some(rating) => { 41 | let parts = rating.split("-").collect::>(); 42 | match (parts.get(0), parts.get(1)) { 43 | (Some(first), Some(second)) => { 44 | let parse_rating = |s: &str| -> i32 { 45 | s.parse::() 46 | .expect(&format!("Failed to parse {} as a rating", s)) 47 | }; 48 | (Some(parse_rating(first)), Some(parse_rating(second))); 49 | } 50 | _ => { 51 | panic!("Could not parse rating, make sure it's in the form '500-1200'") 52 | } 53 | }; 54 | (Some(0), Some(0)) 55 | } 56 | None => (None, None), 57 | } 58 | }; 59 | let tactic = get_new_puzzle(ChessTacticRequest { 60 | rating_gte: rating_lower_bound, 61 | rating_lte: rating_upper_bound, 62 | tags: opts.tags, 63 | }) 64 | .await 65 | .expect("Failed to get a new tactic from the server, exiting."); 66 | let fen = tactic.fen; 67 | // let fen = "r6k/pp2r2p/4Rp1Q/3p4/8/1N1P2R1/PqP2bPP/7K b - - 0 24"; 68 | let moves = tactic.moves; 69 | let setup: Fen = fen.parse()?; 70 | let mut position: Chess = setup.position(CastlingMode::Standard)?; 71 | let mut continuation_moves = moves.iter().map(|m| -> Uci { m.parse().unwrap() }); 72 | let first_move = &continuation_moves 73 | .next() 74 | .unwrap() 75 | .to_move(&position) 76 | .unwrap(); 77 | let their_side = position.turn(); 78 | position = position.play(first_move).unwrap(); 79 | println!(); 80 | print_board(&position); 81 | let mut next_move = continuation_moves 82 | .next() 83 | .unwrap() 84 | .to_move(&position) 85 | .unwrap(); 86 | loop { 87 | println!(); 88 | let san_move = San::from_move(&position, &next_move); 89 | // dbg!(&san_move.to_string()); 90 | let reply = get_prompt_response(&position); 91 | println!(); 92 | let mut correct = false; 93 | match reply { 94 | PromptResponse::ShowBoard => { 95 | print_board(&position); 96 | continue; 97 | } 98 | PromptResponse::Help => { 99 | print_help(); 100 | continue; 101 | } 102 | PromptResponse::PrintFen => { 103 | println!("{}", fen::epd(&position).to_string()); 104 | continue; 105 | } 106 | PromptResponse::NoResponse => {} 107 | PromptResponse::ShowRating => { 108 | println!("This tactic is rated {}.", tactic.rating); 109 | continue; 110 | } 111 | PromptResponse::Move(move_input) => { 112 | if move_input == san_move.to_string() { 113 | correct = true; 114 | } else { 115 | println!("{} is not the correct move", move_input); 116 | continue; 117 | } 118 | } 119 | } 120 | let reply = san_move.to_move(&position).unwrap(); 121 | let old_position = position.clone(); 122 | position = position.play(&reply).unwrap(); 123 | let response = continuation_moves.next(); 124 | match response { 125 | Some(response) => { 126 | let prefix = if correct { 127 | "Correct! ".to_string() 128 | } else { 129 | format!("The correct move was {}. ", san_move.to_string()) 130 | }; 131 | let response = response.to_move(&position).unwrap(); 132 | let response_san = San::from_move(&position, &response); 133 | println!( 134 | "{}{} responds with {}", 135 | prefix, 136 | print_side(&their_side), 137 | response_san.to_string() 138 | ); 139 | position = position.play(&response).unwrap(); 140 | next_move = continuation_moves 141 | .next() 142 | .unwrap() 143 | .to_move(&position) 144 | .unwrap(); 145 | } 146 | None => { 147 | let prefix = if correct { 148 | "Correct! ".to_string() 149 | } else { 150 | "".to_string() 151 | }; 152 | println!("{}Completed this tactic.", prefix); 153 | break; 154 | } 155 | }; 156 | } 157 | return Ok(()); 158 | } 159 | 160 | enum PromptResponse { 161 | ShowBoard, 162 | NoResponse, 163 | PrintFen, 164 | Help, 165 | ShowRating, 166 | Move(String), 167 | } 168 | 169 | fn get_prompt_response(position: &Chess) -> PromptResponse { 170 | let reply = rprompt::prompt_reply_stdout(&get_prompt(position)).unwrap(); 171 | match reply.as_ref() { 172 | "s" | "show" => return PromptResponse::ShowBoard, 173 | "f" | "fen" => return PromptResponse::PrintFen, 174 | "?" | "help" => return PromptResponse::Help, 175 | "r" | "rating" => return PromptResponse::ShowRating, 176 | // "h" | "hint" => return PromptResponse::NoResponse, 177 | "" => return PromptResponse::NoResponse, 178 | x => return PromptResponse::Move(x.to_string()), 179 | } 180 | } 181 | 182 | #[derive(Deserialize, Debug)] 183 | pub struct ChessTactic { 184 | pub id: String, 185 | pub moves: Vec, 186 | pub fen: String, 187 | pub popularity: i32, 188 | pub tags: Vec, 189 | pub game_link: String, 190 | pub rating: i32, 191 | pub rating_deviation: i32, 192 | pub number_plays: i32, 193 | } 194 | 195 | #[derive(Serialize, Debug)] 196 | struct ChessTacticRequest { 197 | rating_gte: Option, 198 | rating_lte: Option, 199 | tags: Vec, 200 | } 201 | 202 | async fn get_new_puzzle(request: ChessTacticRequest) -> Result { 203 | let client = reqwest::Client::new(); 204 | let tactic: ChessTactic = client 205 | .post(get_api_endpoint()) 206 | .header("User-Agent", "tactics-trainer-cli") 207 | .json(&request) 208 | .send() 209 | .await? 210 | .json() 211 | .await?; 212 | // dbg!(&tactic); 213 | return Ok(tactic); 214 | } 215 | 216 | fn get_api_endpoint() -> String { 217 | return format!( 218 | "{}/api/v1/tactic", 219 | env::var("TACTICS_SERVER_URL").unwrap_or("https://chessmadra.com".to_string()) 220 | ); 221 | } 222 | 223 | fn print_side(side: &Color) -> String { 224 | if side == &Color::White { 225 | "White".to_string() 226 | } else { 227 | "Black".to_string() 228 | } 229 | } 230 | 231 | fn get_prompt(position: &Chess) -> String { 232 | let side = if position.turn() == Color::White { 233 | "White" 234 | } else { 235 | "Black" 236 | }; 237 | return format!("{} to move, enter the best move, or '?' for help: ", side); 238 | } 239 | 240 | fn print_help() { 241 | ptable!( 242 | [ 243 | "Any move, ex. Qxd7", 244 | "Attempt to solve the tactic with the given move." 245 | ], 246 | [ 247 | "No input", 248 | "Reveal the answer, and continue the tactic if there are more moves." 249 | ], 250 | [ 251 | "'f' or 'fen'", 252 | "Print out the current board, in FEN notation." 253 | ], 254 | ["'s' or 'show'", "Show the current board."], 255 | ["'r' or 'rating'", "Show the rating of the current tactic."], 256 | ["'?' or 'help'", "Display this help."] 257 | ); 258 | } 259 | 260 | fn print_board(position: &Chess) { 261 | let board: &Board = position.board(); 262 | for row in 0..8 { 263 | print!(" {} ", 8 - row); 264 | for col in 0..8 { 265 | let idx = 64 - (row + 1) * 8 + col; 266 | // dbg!(idx); 267 | let square = Square::new(idx); 268 | // dbg!(square); 269 | let piece = board.piece_at(square); 270 | let square_is_white = (row + col) % 2 == 0; 271 | let c = if square_is_white { 140 } else { 80 }; 272 | let piece_char = piece 273 | .map(|p: Piece| { 274 | let ch = piece_ascii(&p); 275 | let ch = if p.color == Color::White { 276 | ch.blue() 277 | } else { 278 | ch.red() 279 | }; 280 | ch 281 | }) 282 | .unwrap_or("·".to_string().truecolor(c, c, c)); 283 | if square_is_white { 284 | print!("{} ", piece_char); 285 | } else { 286 | print!("{} ", piece_char); 287 | } 288 | } 289 | println!(); 290 | } 291 | 292 | println!( 293 | " {}", 294 | (b'a'..=b'h') 295 | .map(char::from) 296 | .map(|c| c.to_string()) 297 | .collect::>() 298 | .join(" ") 299 | ) 300 | } 301 | 302 | fn piece_unicode(piece: &Piece) -> &'static str { 303 | match (piece.role, piece.color) { 304 | (shakmaty::Role::Pawn, shakmaty::Color::Black) => "♟︎", 305 | (shakmaty::Role::Pawn, shakmaty::Color::White) => "♟︎", 306 | (shakmaty::Role::Knight, shakmaty::Color::Black) => "♞", 307 | (shakmaty::Role::Knight, shakmaty::Color::White) => "♞", 308 | (shakmaty::Role::Bishop, shakmaty::Color::Black) => "♝", 309 | (shakmaty::Role::Bishop, shakmaty::Color::White) => "♝", 310 | (shakmaty::Role::Rook, shakmaty::Color::Black) => "♜", 311 | (shakmaty::Role::Rook, shakmaty::Color::White) => "♜", 312 | (shakmaty::Role::Queen, shakmaty::Color::Black) => "♛", 313 | (shakmaty::Role::Queen, shakmaty::Color::White) => "♛", 314 | (shakmaty::Role::King, shakmaty::Color::Black) => "♚", 315 | (shakmaty::Role::King, shakmaty::Color::White) => "♚", 316 | } 317 | } 318 | 319 | fn piece_ascii(piece: &Piece) -> String { 320 | if piece.role == Role::Pawn { 321 | return match piece.color { 322 | Color::Black => "▲", 323 | Color::White => "▲", 324 | } 325 | .to_string(); 326 | } 327 | return piece.char().to_uppercase().to_string(); 328 | // match (piece.role, piece.color) { 329 | // (shakmaty::Role::Pawn, shakmaty::Color::Black) => {"♟︎"} 330 | // (shakmaty::Role::Pawn, shakmaty::Color::White) => {"♟︎"} 331 | // (shakmaty::Role::Knight, shakmaty::Color::Black) => {"♞"} 332 | // (shakmaty::Role::Knight, shakmaty::Color::White) => {"♞"} 333 | // (shakmaty::Role::Bishop, shakmaty::Color::Black) => {"♝"} 334 | // (shakmaty::Role::Bishop, shakmaty::Color::White) => {"♝"} 335 | // (shakmaty::Role::Rook, shakmaty::Color::Black) => {"♜"} 336 | // (shakmaty::Role::Rook, shakmaty::Color::White) => {"♜"} 337 | // (shakmaty::Role::Queen, shakmaty::Color::Black) => {"♛"} 338 | // (shakmaty::Role::Queen, shakmaty::Color::White) => {"♛"} 339 | // (shakmaty::Role::King, shakmaty::Color::Black) => {"♚"} 340 | // (shakmaty::Role::King, shakmaty::Color::White) => {"♚"} 341 | // } 342 | } 343 | -------------------------------------------------------------------------------- /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 = "anyhow" 7 | version = "1.0.40" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b" 10 | 11 | [[package]] 12 | name = "arrayref" 13 | version = "0.3.6" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 16 | 17 | [[package]] 18 | name = "arrayvec" 19 | version = "0.5.2" 20 | source = "registry+https://github.com/rust-lang/crates.io-index" 21 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 22 | 23 | [[package]] 24 | name = "arrayvec" 25 | version = "0.7.0" 26 | source = "registry+https://github.com/rust-lang/crates.io-index" 27 | checksum = "5a2f58b0bb10c380af2b26e57212856b8c9a59e0925b4c20f4a174a49734eaf7" 28 | 29 | [[package]] 30 | name = "atty" 31 | version = "0.2.14" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 34 | dependencies = [ 35 | "hermit-abi", 36 | "libc", 37 | "winapi", 38 | ] 39 | 40 | [[package]] 41 | name = "autocfg" 42 | version = "1.0.1" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 45 | 46 | [[package]] 47 | name = "base64" 48 | version = "0.13.0" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 51 | 52 | [[package]] 53 | name = "bitflags" 54 | version = "1.2.1" 55 | source = "registry+https://github.com/rust-lang/crates.io-index" 56 | checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" 57 | 58 | [[package]] 59 | name = "blake2b_simd" 60 | version = "0.5.11" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" 63 | dependencies = [ 64 | "arrayref", 65 | "arrayvec 0.5.2", 66 | "constant_time_eq", 67 | ] 68 | 69 | [[package]] 70 | name = "bstr" 71 | version = "0.2.16" 72 | source = "registry+https://github.com/rust-lang/crates.io-index" 73 | checksum = "90682c8d613ad3373e66de8c6411e0ae2ab2571e879d2efbf73558cc66f21279" 74 | dependencies = [ 75 | "lazy_static", 76 | "memchr", 77 | "regex-automata", 78 | "serde", 79 | ] 80 | 81 | [[package]] 82 | name = "btoi" 83 | version = "0.4.2" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "97c0869a9faa81f8bbf8102371105d6d0a7b79167a04c340b04ab16892246a11" 86 | dependencies = [ 87 | "num-traits", 88 | ] 89 | 90 | [[package]] 91 | name = "bumpalo" 92 | version = "3.6.1" 93 | source = "registry+https://github.com/rust-lang/crates.io-index" 94 | checksum = "63396b8a4b9de3f4fdfb320ab6080762242f66a8ef174c49d8e19b674db4cdbe" 95 | 96 | [[package]] 97 | name = "byteorder" 98 | version = "1.4.3" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 101 | 102 | [[package]] 103 | name = "bytes" 104 | version = "1.0.1" 105 | source = "registry+https://github.com/rust-lang/crates.io-index" 106 | checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" 107 | 108 | [[package]] 109 | name = "cc" 110 | version = "1.0.67" 111 | source = "registry+https://github.com/rust-lang/crates.io-index" 112 | checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" 113 | 114 | [[package]] 115 | name = "cfg-if" 116 | version = "1.0.0" 117 | source = "registry+https://github.com/rust-lang/crates.io-index" 118 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 119 | 120 | [[package]] 121 | name = "clap" 122 | version = "3.0.2" 123 | source = "registry+https://github.com/rust-lang/crates.io-index" 124 | checksum = "cf99067eed62f7ede7267fed6ced21f61b60667651d4e1fe637859af0cafa065" 125 | dependencies = [ 126 | "atty", 127 | "bitflags", 128 | "clap_derive", 129 | "indexmap", 130 | "lazy_static", 131 | "os_str_bytes", 132 | "strsim", 133 | "termcolor", 134 | "textwrap", 135 | ] 136 | 137 | [[package]] 138 | name = "clap_derive" 139 | version = "3.0.2" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "448c8b00367288ad41804ac7a9e0fe58f2324a36901cb5d6b6db58be86d1db8f" 142 | dependencies = [ 143 | "heck", 144 | "proc-macro-error", 145 | "proc-macro2", 146 | "quote", 147 | "syn", 148 | ] 149 | 150 | [[package]] 151 | name = "colored" 152 | version = "2.0.0" 153 | source = "registry+https://github.com/rust-lang/crates.io-index" 154 | checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" 155 | dependencies = [ 156 | "atty", 157 | "lazy_static", 158 | "winapi", 159 | ] 160 | 161 | [[package]] 162 | name = "constant_time_eq" 163 | version = "0.1.5" 164 | source = "registry+https://github.com/rust-lang/crates.io-index" 165 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 166 | 167 | [[package]] 168 | name = "core-foundation" 169 | version = "0.9.1" 170 | source = "registry+https://github.com/rust-lang/crates.io-index" 171 | checksum = "0a89e2ae426ea83155dccf10c0fa6b1463ef6d5fcb44cee0b224a408fa640a62" 172 | dependencies = [ 173 | "core-foundation-sys", 174 | "libc", 175 | ] 176 | 177 | [[package]] 178 | name = "core-foundation-sys" 179 | version = "0.8.2" 180 | source = "registry+https://github.com/rust-lang/crates.io-index" 181 | checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" 182 | 183 | [[package]] 184 | name = "crossbeam-utils" 185 | version = "0.8.4" 186 | source = "registry+https://github.com/rust-lang/crates.io-index" 187 | checksum = "4feb231f0d4d6af81aed15928e58ecf5816aa62a2393e2c82f46973e92a9a278" 188 | dependencies = [ 189 | "autocfg", 190 | "cfg-if", 191 | "lazy_static", 192 | ] 193 | 194 | [[package]] 195 | name = "csv" 196 | version = "1.1.6" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1" 199 | dependencies = [ 200 | "bstr", 201 | "csv-core", 202 | "itoa", 203 | "ryu", 204 | "serde", 205 | ] 206 | 207 | [[package]] 208 | name = "csv-core" 209 | version = "0.1.10" 210 | source = "registry+https://github.com/rust-lang/crates.io-index" 211 | checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" 212 | dependencies = [ 213 | "memchr", 214 | ] 215 | 216 | [[package]] 217 | name = "dirs" 218 | version = "1.0.5" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" 221 | dependencies = [ 222 | "libc", 223 | "redox_users", 224 | "winapi", 225 | ] 226 | 227 | [[package]] 228 | name = "encode_unicode" 229 | version = "0.3.6" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" 232 | 233 | [[package]] 234 | name = "encoding_rs" 235 | version = "0.8.28" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" 238 | dependencies = [ 239 | "cfg-if", 240 | ] 241 | 242 | [[package]] 243 | name = "fnv" 244 | version = "1.0.7" 245 | source = "registry+https://github.com/rust-lang/crates.io-index" 246 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 247 | 248 | [[package]] 249 | name = "foreign-types" 250 | version = "0.3.2" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 253 | dependencies = [ 254 | "foreign-types-shared", 255 | ] 256 | 257 | [[package]] 258 | name = "foreign-types-shared" 259 | version = "0.1.1" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 262 | 263 | [[package]] 264 | name = "form_urlencoded" 265 | version = "1.0.1" 266 | source = "registry+https://github.com/rust-lang/crates.io-index" 267 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 268 | dependencies = [ 269 | "matches", 270 | "percent-encoding", 271 | ] 272 | 273 | [[package]] 274 | name = "futures-channel" 275 | version = "0.3.15" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" 278 | dependencies = [ 279 | "futures-core", 280 | ] 281 | 282 | [[package]] 283 | name = "futures-core" 284 | version = "0.3.15" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1" 287 | 288 | [[package]] 289 | name = "futures-sink" 290 | version = "0.3.15" 291 | source = "registry+https://github.com/rust-lang/crates.io-index" 292 | checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" 293 | 294 | [[package]] 295 | name = "futures-task" 296 | version = "0.3.15" 297 | source = "registry+https://github.com/rust-lang/crates.io-index" 298 | checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae" 299 | 300 | [[package]] 301 | name = "futures-util" 302 | version = "0.3.15" 303 | source = "registry+https://github.com/rust-lang/crates.io-index" 304 | checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" 305 | dependencies = [ 306 | "autocfg", 307 | "futures-core", 308 | "futures-task", 309 | "pin-project-lite", 310 | "pin-utils", 311 | ] 312 | 313 | [[package]] 314 | name = "getrandom" 315 | version = "0.1.16" 316 | source = "registry+https://github.com/rust-lang/crates.io-index" 317 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 318 | dependencies = [ 319 | "cfg-if", 320 | "libc", 321 | "wasi 0.9.0+wasi-snapshot-preview1", 322 | ] 323 | 324 | [[package]] 325 | name = "getrandom" 326 | version = "0.2.2" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" 329 | dependencies = [ 330 | "cfg-if", 331 | "libc", 332 | "wasi 0.10.2+wasi-snapshot-preview1", 333 | ] 334 | 335 | [[package]] 336 | name = "h2" 337 | version = "0.3.3" 338 | source = "registry+https://github.com/rust-lang/crates.io-index" 339 | checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726" 340 | dependencies = [ 341 | "bytes", 342 | "fnv", 343 | "futures-core", 344 | "futures-sink", 345 | "futures-util", 346 | "http", 347 | "indexmap", 348 | "slab", 349 | "tokio", 350 | "tokio-util", 351 | "tracing", 352 | ] 353 | 354 | [[package]] 355 | name = "hashbrown" 356 | version = "0.9.1" 357 | source = "registry+https://github.com/rust-lang/crates.io-index" 358 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 359 | 360 | [[package]] 361 | name = "heck" 362 | version = "0.4.0" 363 | source = "registry+https://github.com/rust-lang/crates.io-index" 364 | checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" 365 | 366 | [[package]] 367 | name = "hermit-abi" 368 | version = "0.1.18" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 371 | dependencies = [ 372 | "libc", 373 | ] 374 | 375 | [[package]] 376 | name = "http" 377 | version = "0.2.4" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" 380 | dependencies = [ 381 | "bytes", 382 | "fnv", 383 | "itoa", 384 | ] 385 | 386 | [[package]] 387 | name = "http-body" 388 | version = "0.4.2" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" 391 | dependencies = [ 392 | "bytes", 393 | "http", 394 | "pin-project-lite", 395 | ] 396 | 397 | [[package]] 398 | name = "httparse" 399 | version = "1.4.1" 400 | source = "registry+https://github.com/rust-lang/crates.io-index" 401 | checksum = "f3a87b616e37e93c22fb19bcd386f02f3af5ea98a25670ad0fce773de23c5e68" 402 | 403 | [[package]] 404 | name = "httpdate" 405 | version = "1.0.0" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9" 408 | 409 | [[package]] 410 | name = "hyper" 411 | version = "0.14.7" 412 | source = "registry+https://github.com/rust-lang/crates.io-index" 413 | checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54" 414 | dependencies = [ 415 | "bytes", 416 | "futures-channel", 417 | "futures-core", 418 | "futures-util", 419 | "h2", 420 | "http", 421 | "http-body", 422 | "httparse", 423 | "httpdate", 424 | "itoa", 425 | "pin-project", 426 | "socket2", 427 | "tokio", 428 | "tower-service", 429 | "tracing", 430 | "want", 431 | ] 432 | 433 | [[package]] 434 | name = "hyper-tls" 435 | version = "0.5.0" 436 | source = "registry+https://github.com/rust-lang/crates.io-index" 437 | checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" 438 | dependencies = [ 439 | "bytes", 440 | "hyper", 441 | "native-tls", 442 | "tokio", 443 | "tokio-native-tls", 444 | ] 445 | 446 | [[package]] 447 | name = "idna" 448 | version = "0.2.3" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 451 | dependencies = [ 452 | "matches", 453 | "unicode-bidi", 454 | "unicode-normalization", 455 | ] 456 | 457 | [[package]] 458 | name = "indexmap" 459 | version = "1.6.2" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3" 462 | dependencies = [ 463 | "autocfg", 464 | "hashbrown", 465 | ] 466 | 467 | [[package]] 468 | name = "instant" 469 | version = "0.1.9" 470 | source = "registry+https://github.com/rust-lang/crates.io-index" 471 | checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" 472 | dependencies = [ 473 | "cfg-if", 474 | ] 475 | 476 | [[package]] 477 | name = "ipnet" 478 | version = "2.3.0" 479 | source = "registry+https://github.com/rust-lang/crates.io-index" 480 | checksum = "47be2f14c678be2fdcab04ab1171db51b2762ce6f0a8ee87c8dd4a04ed216135" 481 | 482 | [[package]] 483 | name = "itoa" 484 | version = "0.4.7" 485 | source = "registry+https://github.com/rust-lang/crates.io-index" 486 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 487 | 488 | [[package]] 489 | name = "js-sys" 490 | version = "0.3.51" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "83bdfbace3a0e81a4253f73b49e960b053e396a11012cbd49b9b74d6a2b67062" 493 | dependencies = [ 494 | "wasm-bindgen", 495 | ] 496 | 497 | [[package]] 498 | name = "lazy_static" 499 | version = "1.4.0" 500 | source = "registry+https://github.com/rust-lang/crates.io-index" 501 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 502 | 503 | [[package]] 504 | name = "libc" 505 | version = "0.2.94" 506 | source = "registry+https://github.com/rust-lang/crates.io-index" 507 | checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e" 508 | 509 | [[package]] 510 | name = "lock_api" 511 | version = "0.4.4" 512 | source = "registry+https://github.com/rust-lang/crates.io-index" 513 | checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" 514 | dependencies = [ 515 | "scopeguard", 516 | ] 517 | 518 | [[package]] 519 | name = "log" 520 | version = "0.4.14" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 523 | dependencies = [ 524 | "cfg-if", 525 | ] 526 | 527 | [[package]] 528 | name = "matches" 529 | version = "0.1.8" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" 532 | 533 | [[package]] 534 | name = "memchr" 535 | version = "2.4.0" 536 | source = "registry+https://github.com/rust-lang/crates.io-index" 537 | checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc" 538 | 539 | [[package]] 540 | name = "mime" 541 | version = "0.3.16" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 544 | 545 | [[package]] 546 | name = "mio" 547 | version = "0.7.11" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956" 550 | dependencies = [ 551 | "libc", 552 | "log", 553 | "miow", 554 | "ntapi", 555 | "winapi", 556 | ] 557 | 558 | [[package]] 559 | name = "miow" 560 | version = "0.3.7" 561 | source = "registry+https://github.com/rust-lang/crates.io-index" 562 | checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" 563 | dependencies = [ 564 | "winapi", 565 | ] 566 | 567 | [[package]] 568 | name = "native-tls" 569 | version = "0.2.7" 570 | source = "registry+https://github.com/rust-lang/crates.io-index" 571 | checksum = "b8d96b2e1c8da3957d58100b09f102c6d9cfdfced01b7ec5a8974044bb09dbd4" 572 | dependencies = [ 573 | "lazy_static", 574 | "libc", 575 | "log", 576 | "openssl", 577 | "openssl-probe", 578 | "openssl-sys", 579 | "schannel", 580 | "security-framework", 581 | "security-framework-sys", 582 | "tempfile", 583 | ] 584 | 585 | [[package]] 586 | name = "ntapi" 587 | version = "0.3.6" 588 | source = "registry+https://github.com/rust-lang/crates.io-index" 589 | checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" 590 | dependencies = [ 591 | "winapi", 592 | ] 593 | 594 | [[package]] 595 | name = "num-traits" 596 | version = "0.2.14" 597 | source = "registry+https://github.com/rust-lang/crates.io-index" 598 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 599 | dependencies = [ 600 | "autocfg", 601 | ] 602 | 603 | [[package]] 604 | name = "num_cpus" 605 | version = "1.13.0" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 608 | dependencies = [ 609 | "hermit-abi", 610 | "libc", 611 | ] 612 | 613 | [[package]] 614 | name = "once_cell" 615 | version = "1.7.2" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" 618 | 619 | [[package]] 620 | name = "openssl" 621 | version = "0.10.34" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "6d7830286ad6a3973c0f1d9b73738f69c76b739301d0229c4b96501695cbe4c8" 624 | dependencies = [ 625 | "bitflags", 626 | "cfg-if", 627 | "foreign-types", 628 | "libc", 629 | "once_cell", 630 | "openssl-sys", 631 | ] 632 | 633 | [[package]] 634 | name = "openssl-probe" 635 | version = "0.1.4" 636 | source = "registry+https://github.com/rust-lang/crates.io-index" 637 | checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" 638 | 639 | [[package]] 640 | name = "openssl-sys" 641 | version = "0.9.63" 642 | source = "registry+https://github.com/rust-lang/crates.io-index" 643 | checksum = "b6b0d6fb7d80f877617dfcb014e605e2b5ab2fb0afdf27935219bb6bd984cb98" 644 | dependencies = [ 645 | "autocfg", 646 | "cc", 647 | "libc", 648 | "pkg-config", 649 | "vcpkg", 650 | ] 651 | 652 | [[package]] 653 | name = "os_str_bytes" 654 | version = "6.0.0" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64" 657 | dependencies = [ 658 | "memchr", 659 | ] 660 | 661 | [[package]] 662 | name = "parking_lot" 663 | version = "0.11.1" 664 | source = "registry+https://github.com/rust-lang/crates.io-index" 665 | checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" 666 | dependencies = [ 667 | "instant", 668 | "lock_api", 669 | "parking_lot_core", 670 | ] 671 | 672 | [[package]] 673 | name = "parking_lot_core" 674 | version = "0.8.3" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" 677 | dependencies = [ 678 | "cfg-if", 679 | "instant", 680 | "libc", 681 | "redox_syscall 0.2.8", 682 | "smallvec", 683 | "winapi", 684 | ] 685 | 686 | [[package]] 687 | name = "percent-encoding" 688 | version = "2.1.0" 689 | source = "registry+https://github.com/rust-lang/crates.io-index" 690 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 691 | 692 | [[package]] 693 | name = "pin-project" 694 | version = "1.0.7" 695 | source = "registry+https://github.com/rust-lang/crates.io-index" 696 | checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" 697 | dependencies = [ 698 | "pin-project-internal", 699 | ] 700 | 701 | [[package]] 702 | name = "pin-project-internal" 703 | version = "1.0.7" 704 | source = "registry+https://github.com/rust-lang/crates.io-index" 705 | checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" 706 | dependencies = [ 707 | "proc-macro2", 708 | "quote", 709 | "syn", 710 | ] 711 | 712 | [[package]] 713 | name = "pin-project-lite" 714 | version = "0.2.6" 715 | source = "registry+https://github.com/rust-lang/crates.io-index" 716 | checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905" 717 | 718 | [[package]] 719 | name = "pin-utils" 720 | version = "0.1.0" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 723 | 724 | [[package]] 725 | name = "pkg-config" 726 | version = "0.3.19" 727 | source = "registry+https://github.com/rust-lang/crates.io-index" 728 | checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" 729 | 730 | [[package]] 731 | name = "ppv-lite86" 732 | version = "0.2.10" 733 | source = "registry+https://github.com/rust-lang/crates.io-index" 734 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 735 | 736 | [[package]] 737 | name = "prettytable-rs" 738 | version = "0.8.0" 739 | source = "registry+https://github.com/rust-lang/crates.io-index" 740 | checksum = "0fd04b170004fa2daccf418a7f8253aaf033c27760b5f225889024cf66d7ac2e" 741 | dependencies = [ 742 | "atty", 743 | "csv", 744 | "encode_unicode", 745 | "lazy_static", 746 | "term", 747 | "unicode-width", 748 | ] 749 | 750 | [[package]] 751 | name = "proc-macro-error" 752 | version = "1.0.4" 753 | source = "registry+https://github.com/rust-lang/crates.io-index" 754 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 755 | dependencies = [ 756 | "proc-macro-error-attr", 757 | "proc-macro2", 758 | "quote", 759 | "syn", 760 | "version_check", 761 | ] 762 | 763 | [[package]] 764 | name = "proc-macro-error-attr" 765 | version = "1.0.4" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 768 | dependencies = [ 769 | "proc-macro2", 770 | "quote", 771 | "version_check", 772 | ] 773 | 774 | [[package]] 775 | name = "proc-macro2" 776 | version = "1.0.36" 777 | source = "registry+https://github.com/rust-lang/crates.io-index" 778 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 779 | dependencies = [ 780 | "unicode-xid", 781 | ] 782 | 783 | [[package]] 784 | name = "quote" 785 | version = "1.0.9" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 788 | dependencies = [ 789 | "proc-macro2", 790 | ] 791 | 792 | [[package]] 793 | name = "rand" 794 | version = "0.8.3" 795 | source = "registry+https://github.com/rust-lang/crates.io-index" 796 | checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" 797 | dependencies = [ 798 | "libc", 799 | "rand_chacha", 800 | "rand_core", 801 | "rand_hc", 802 | ] 803 | 804 | [[package]] 805 | name = "rand_chacha" 806 | version = "0.3.0" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" 809 | dependencies = [ 810 | "ppv-lite86", 811 | "rand_core", 812 | ] 813 | 814 | [[package]] 815 | name = "rand_core" 816 | version = "0.6.2" 817 | source = "registry+https://github.com/rust-lang/crates.io-index" 818 | checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 819 | dependencies = [ 820 | "getrandom 0.2.2", 821 | ] 822 | 823 | [[package]] 824 | name = "rand_hc" 825 | version = "0.3.0" 826 | source = "registry+https://github.com/rust-lang/crates.io-index" 827 | checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" 828 | dependencies = [ 829 | "rand_core", 830 | ] 831 | 832 | [[package]] 833 | name = "redox_syscall" 834 | version = "0.1.57" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" 837 | 838 | [[package]] 839 | name = "redox_syscall" 840 | version = "0.2.8" 841 | source = "registry+https://github.com/rust-lang/crates.io-index" 842 | checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" 843 | dependencies = [ 844 | "bitflags", 845 | ] 846 | 847 | [[package]] 848 | name = "redox_users" 849 | version = "0.3.5" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" 852 | dependencies = [ 853 | "getrandom 0.1.16", 854 | "redox_syscall 0.1.57", 855 | "rust-argon2", 856 | ] 857 | 858 | [[package]] 859 | name = "regex-automata" 860 | version = "0.1.9" 861 | source = "registry+https://github.com/rust-lang/crates.io-index" 862 | checksum = "ae1ded71d66a4a97f5e961fd0cb25a5f366a42a41570d16a763a69c092c26ae4" 863 | dependencies = [ 864 | "byteorder", 865 | ] 866 | 867 | [[package]] 868 | name = "remove_dir_all" 869 | version = "0.5.3" 870 | source = "registry+https://github.com/rust-lang/crates.io-index" 871 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 872 | dependencies = [ 873 | "winapi", 874 | ] 875 | 876 | [[package]] 877 | name = "reqwest" 878 | version = "0.11.3" 879 | source = "registry+https://github.com/rust-lang/crates.io-index" 880 | checksum = "2296f2fac53979e8ccbc4a1136b25dcefd37be9ed7e4a1f6b05a6029c84ff124" 881 | dependencies = [ 882 | "base64", 883 | "bytes", 884 | "encoding_rs", 885 | "futures-core", 886 | "futures-util", 887 | "http", 888 | "http-body", 889 | "hyper", 890 | "hyper-tls", 891 | "ipnet", 892 | "js-sys", 893 | "lazy_static", 894 | "log", 895 | "mime", 896 | "native-tls", 897 | "percent-encoding", 898 | "pin-project-lite", 899 | "serde", 900 | "serde_json", 901 | "serde_urlencoded", 902 | "tokio", 903 | "tokio-native-tls", 904 | "url", 905 | "wasm-bindgen", 906 | "wasm-bindgen-futures", 907 | "web-sys", 908 | "winreg", 909 | ] 910 | 911 | [[package]] 912 | name = "rprompt" 913 | version = "1.0.5" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "b386f4748bdae2aefc96857f5fda07647f851d089420e577831e2a14b45230f8" 916 | 917 | [[package]] 918 | name = "rust-argon2" 919 | version = "0.8.3" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" 922 | dependencies = [ 923 | "base64", 924 | "blake2b_simd", 925 | "constant_time_eq", 926 | "crossbeam-utils", 927 | ] 928 | 929 | [[package]] 930 | name = "ryu" 931 | version = "1.0.5" 932 | source = "registry+https://github.com/rust-lang/crates.io-index" 933 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 934 | 935 | [[package]] 936 | name = "schannel" 937 | version = "0.1.19" 938 | source = "registry+https://github.com/rust-lang/crates.io-index" 939 | checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" 940 | dependencies = [ 941 | "lazy_static", 942 | "winapi", 943 | ] 944 | 945 | [[package]] 946 | name = "scopeguard" 947 | version = "1.1.0" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 950 | 951 | [[package]] 952 | name = "security-framework" 953 | version = "2.2.0" 954 | source = "registry+https://github.com/rust-lang/crates.io-index" 955 | checksum = "3670b1d2fdf6084d192bc71ead7aabe6c06aa2ea3fbd9cc3ac111fa5c2b1bd84" 956 | dependencies = [ 957 | "bitflags", 958 | "core-foundation", 959 | "core-foundation-sys", 960 | "libc", 961 | "security-framework-sys", 962 | ] 963 | 964 | [[package]] 965 | name = "security-framework-sys" 966 | version = "2.2.0" 967 | source = "registry+https://github.com/rust-lang/crates.io-index" 968 | checksum = "3676258fd3cfe2c9a0ec99ce3038798d847ce3e4bb17746373eb9f0f1ac16339" 969 | dependencies = [ 970 | "core-foundation-sys", 971 | "libc", 972 | ] 973 | 974 | [[package]] 975 | name = "serde" 976 | version = "1.0.126" 977 | source = "registry+https://github.com/rust-lang/crates.io-index" 978 | checksum = "ec7505abeacaec74ae4778d9d9328fe5a5d04253220a85c4ee022239fc996d03" 979 | dependencies = [ 980 | "serde_derive", 981 | ] 982 | 983 | [[package]] 984 | name = "serde_derive" 985 | version = "1.0.126" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "963a7dbc9895aeac7ac90e74f34a5d5261828f79df35cbed41e10189d3804d43" 988 | dependencies = [ 989 | "proc-macro2", 990 | "quote", 991 | "syn", 992 | ] 993 | 994 | [[package]] 995 | name = "serde_json" 996 | version = "1.0.64" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" 999 | dependencies = [ 1000 | "itoa", 1001 | "ryu", 1002 | "serde", 1003 | ] 1004 | 1005 | [[package]] 1006 | name = "serde_urlencoded" 1007 | version = "0.7.0" 1008 | source = "registry+https://github.com/rust-lang/crates.io-index" 1009 | checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" 1010 | dependencies = [ 1011 | "form_urlencoded", 1012 | "itoa", 1013 | "ryu", 1014 | "serde", 1015 | ] 1016 | 1017 | [[package]] 1018 | name = "shakmaty" 1019 | version = "0.19.0" 1020 | source = "registry+https://github.com/rust-lang/crates.io-index" 1021 | checksum = "5d2f76c665c10e915a3371689a668796f9fe1f93b47a6dd1955e0ebe91477f51" 1022 | dependencies = [ 1023 | "arrayvec 0.7.0", 1024 | "bitflags", 1025 | "btoi", 1026 | ] 1027 | 1028 | [[package]] 1029 | name = "signal-hook-registry" 1030 | version = "1.3.0" 1031 | source = "registry+https://github.com/rust-lang/crates.io-index" 1032 | checksum = "16f1d0fef1604ba8f7a073c7e701f213e056707210e9020af4528e0101ce11a6" 1033 | dependencies = [ 1034 | "libc", 1035 | ] 1036 | 1037 | [[package]] 1038 | name = "slab" 1039 | version = "0.4.3" 1040 | source = "registry+https://github.com/rust-lang/crates.io-index" 1041 | checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" 1042 | 1043 | [[package]] 1044 | name = "smallvec" 1045 | version = "1.6.1" 1046 | source = "registry+https://github.com/rust-lang/crates.io-index" 1047 | checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" 1048 | 1049 | [[package]] 1050 | name = "socket2" 1051 | version = "0.4.0" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" 1054 | dependencies = [ 1055 | "libc", 1056 | "winapi", 1057 | ] 1058 | 1059 | [[package]] 1060 | name = "strsim" 1061 | version = "0.10.0" 1062 | source = "registry+https://github.com/rust-lang/crates.io-index" 1063 | checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" 1064 | 1065 | [[package]] 1066 | name = "syn" 1067 | version = "1.0.84" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "ecb2e6da8ee5eb9a61068762a32fa9619cc591ceb055b3687f4cd4051ec2e06b" 1070 | dependencies = [ 1071 | "proc-macro2", 1072 | "quote", 1073 | "unicode-xid", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "tactics-trainer-cli" 1078 | version = "1.0.1" 1079 | dependencies = [ 1080 | "anyhow", 1081 | "clap", 1082 | "colored", 1083 | "prettytable-rs", 1084 | "reqwest", 1085 | "rprompt", 1086 | "serde", 1087 | "serde_json", 1088 | "shakmaty", 1089 | "tokio", 1090 | ] 1091 | 1092 | [[package]] 1093 | name = "tempfile" 1094 | version = "3.2.0" 1095 | source = "registry+https://github.com/rust-lang/crates.io-index" 1096 | checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" 1097 | dependencies = [ 1098 | "cfg-if", 1099 | "libc", 1100 | "rand", 1101 | "redox_syscall 0.2.8", 1102 | "remove_dir_all", 1103 | "winapi", 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "term" 1108 | version = "0.5.2" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "edd106a334b7657c10b7c540a0106114feadeb4dc314513e97df481d5d966f42" 1111 | dependencies = [ 1112 | "byteorder", 1113 | "dirs", 1114 | "winapi", 1115 | ] 1116 | 1117 | [[package]] 1118 | name = "termcolor" 1119 | version = "1.1.2" 1120 | source = "registry+https://github.com/rust-lang/crates.io-index" 1121 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 1122 | dependencies = [ 1123 | "winapi-util", 1124 | ] 1125 | 1126 | [[package]] 1127 | name = "textwrap" 1128 | version = "0.14.2" 1129 | source = "registry+https://github.com/rust-lang/crates.io-index" 1130 | checksum = "0066c8d12af8b5acd21e00547c3797fde4e8677254a7ee429176ccebbe93dd80" 1131 | 1132 | [[package]] 1133 | name = "tinyvec" 1134 | version = "1.2.0" 1135 | source = "registry+https://github.com/rust-lang/crates.io-index" 1136 | checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" 1137 | dependencies = [ 1138 | "tinyvec_macros", 1139 | ] 1140 | 1141 | [[package]] 1142 | name = "tinyvec_macros" 1143 | version = "0.1.0" 1144 | source = "registry+https://github.com/rust-lang/crates.io-index" 1145 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1146 | 1147 | [[package]] 1148 | name = "tokio" 1149 | version = "1.5.0" 1150 | source = "registry+https://github.com/rust-lang/crates.io-index" 1151 | checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5" 1152 | dependencies = [ 1153 | "autocfg", 1154 | "bytes", 1155 | "libc", 1156 | "memchr", 1157 | "mio", 1158 | "num_cpus", 1159 | "once_cell", 1160 | "parking_lot", 1161 | "pin-project-lite", 1162 | "signal-hook-registry", 1163 | "tokio-macros", 1164 | "winapi", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "tokio-macros" 1169 | version = "1.1.0" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57" 1172 | dependencies = [ 1173 | "proc-macro2", 1174 | "quote", 1175 | "syn", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "tokio-native-tls" 1180 | version = "0.3.0" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" 1183 | dependencies = [ 1184 | "native-tls", 1185 | "tokio", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "tokio-util" 1190 | version = "0.6.6" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e" 1193 | dependencies = [ 1194 | "bytes", 1195 | "futures-core", 1196 | "futures-sink", 1197 | "log", 1198 | "pin-project-lite", 1199 | "tokio", 1200 | ] 1201 | 1202 | [[package]] 1203 | name = "tower-service" 1204 | version = "0.3.1" 1205 | source = "registry+https://github.com/rust-lang/crates.io-index" 1206 | checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" 1207 | 1208 | [[package]] 1209 | name = "tracing" 1210 | version = "0.1.26" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" 1213 | dependencies = [ 1214 | "cfg-if", 1215 | "pin-project-lite", 1216 | "tracing-core", 1217 | ] 1218 | 1219 | [[package]] 1220 | name = "tracing-core" 1221 | version = "0.1.18" 1222 | source = "registry+https://github.com/rust-lang/crates.io-index" 1223 | checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" 1224 | dependencies = [ 1225 | "lazy_static", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "try-lock" 1230 | version = "0.2.3" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 1233 | 1234 | [[package]] 1235 | name = "unicode-bidi" 1236 | version = "0.3.5" 1237 | source = "registry+https://github.com/rust-lang/crates.io-index" 1238 | checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" 1239 | dependencies = [ 1240 | "matches", 1241 | ] 1242 | 1243 | [[package]] 1244 | name = "unicode-normalization" 1245 | version = "0.1.17" 1246 | source = "registry+https://github.com/rust-lang/crates.io-index" 1247 | checksum = "07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef" 1248 | dependencies = [ 1249 | "tinyvec", 1250 | ] 1251 | 1252 | [[package]] 1253 | name = "unicode-width" 1254 | version = "0.1.8" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" 1257 | 1258 | [[package]] 1259 | name = "unicode-xid" 1260 | version = "0.2.2" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 1263 | 1264 | [[package]] 1265 | name = "url" 1266 | version = "2.2.2" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1269 | dependencies = [ 1270 | "form_urlencoded", 1271 | "idna", 1272 | "matches", 1273 | "percent-encoding", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "vcpkg" 1278 | version = "0.2.12" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d" 1281 | 1282 | [[package]] 1283 | name = "version_check" 1284 | version = "0.9.3" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" 1287 | 1288 | [[package]] 1289 | name = "want" 1290 | version = "0.3.0" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1293 | dependencies = [ 1294 | "log", 1295 | "try-lock", 1296 | ] 1297 | 1298 | [[package]] 1299 | name = "wasi" 1300 | version = "0.9.0+wasi-snapshot-preview1" 1301 | source = "registry+https://github.com/rust-lang/crates.io-index" 1302 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1303 | 1304 | [[package]] 1305 | name = "wasi" 1306 | version = "0.10.2+wasi-snapshot-preview1" 1307 | source = "registry+https://github.com/rust-lang/crates.io-index" 1308 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 1309 | 1310 | [[package]] 1311 | name = "wasm-bindgen" 1312 | version = "0.2.74" 1313 | source = "registry+https://github.com/rust-lang/crates.io-index" 1314 | checksum = "d54ee1d4ed486f78874278e63e4069fc1ab9f6a18ca492076ffb90c5eb2997fd" 1315 | dependencies = [ 1316 | "cfg-if", 1317 | "serde", 1318 | "serde_json", 1319 | "wasm-bindgen-macro", 1320 | ] 1321 | 1322 | [[package]] 1323 | name = "wasm-bindgen-backend" 1324 | version = "0.2.74" 1325 | source = "registry+https://github.com/rust-lang/crates.io-index" 1326 | checksum = "3b33f6a0694ccfea53d94db8b2ed1c3a8a4c86dd936b13b9f0a15ec4a451b900" 1327 | dependencies = [ 1328 | "bumpalo", 1329 | "lazy_static", 1330 | "log", 1331 | "proc-macro2", 1332 | "quote", 1333 | "syn", 1334 | "wasm-bindgen-shared", 1335 | ] 1336 | 1337 | [[package]] 1338 | name = "wasm-bindgen-futures" 1339 | version = "0.4.24" 1340 | source = "registry+https://github.com/rust-lang/crates.io-index" 1341 | checksum = "5fba7978c679d53ce2d0ac80c8c175840feb849a161664365d1287b41f2e67f1" 1342 | dependencies = [ 1343 | "cfg-if", 1344 | "js-sys", 1345 | "wasm-bindgen", 1346 | "web-sys", 1347 | ] 1348 | 1349 | [[package]] 1350 | name = "wasm-bindgen-macro" 1351 | version = "0.2.74" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "088169ca61430fe1e58b8096c24975251700e7b1f6fd91cc9d59b04fb9b18bd4" 1354 | dependencies = [ 1355 | "quote", 1356 | "wasm-bindgen-macro-support", 1357 | ] 1358 | 1359 | [[package]] 1360 | name = "wasm-bindgen-macro-support" 1361 | version = "0.2.74" 1362 | source = "registry+https://github.com/rust-lang/crates.io-index" 1363 | checksum = "be2241542ff3d9f241f5e2cb6dd09b37efe786df8851c54957683a49f0987a97" 1364 | dependencies = [ 1365 | "proc-macro2", 1366 | "quote", 1367 | "syn", 1368 | "wasm-bindgen-backend", 1369 | "wasm-bindgen-shared", 1370 | ] 1371 | 1372 | [[package]] 1373 | name = "wasm-bindgen-shared" 1374 | version = "0.2.74" 1375 | source = "registry+https://github.com/rust-lang/crates.io-index" 1376 | checksum = "d7cff876b8f18eed75a66cf49b65e7f967cb354a7aa16003fb55dbfd25b44b4f" 1377 | 1378 | [[package]] 1379 | name = "web-sys" 1380 | version = "0.3.51" 1381 | source = "registry+https://github.com/rust-lang/crates.io-index" 1382 | checksum = "e828417b379f3df7111d3a2a9e5753706cae29c41f7c4029ee9fd77f3e09e582" 1383 | dependencies = [ 1384 | "js-sys", 1385 | "wasm-bindgen", 1386 | ] 1387 | 1388 | [[package]] 1389 | name = "winapi" 1390 | version = "0.3.9" 1391 | source = "registry+https://github.com/rust-lang/crates.io-index" 1392 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1393 | dependencies = [ 1394 | "winapi-i686-pc-windows-gnu", 1395 | "winapi-x86_64-pc-windows-gnu", 1396 | ] 1397 | 1398 | [[package]] 1399 | name = "winapi-i686-pc-windows-gnu" 1400 | version = "0.4.0" 1401 | source = "registry+https://github.com/rust-lang/crates.io-index" 1402 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1403 | 1404 | [[package]] 1405 | name = "winapi-util" 1406 | version = "0.1.5" 1407 | source = "registry+https://github.com/rust-lang/crates.io-index" 1408 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1409 | dependencies = [ 1410 | "winapi", 1411 | ] 1412 | 1413 | [[package]] 1414 | name = "winapi-x86_64-pc-windows-gnu" 1415 | version = "0.4.0" 1416 | source = "registry+https://github.com/rust-lang/crates.io-index" 1417 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1418 | 1419 | [[package]] 1420 | name = "winreg" 1421 | version = "0.7.0" 1422 | source = "registry+https://github.com/rust-lang/crates.io-index" 1423 | checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" 1424 | dependencies = [ 1425 | "winapi", 1426 | ] 1427 | --------------------------------------------------------------------------------