├── .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 | 
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 |
--------------------------------------------------------------------------------