├── .gitignore ├── .dockerignore ├── Dockerfile ├── README.md ├── Cargo.toml ├── README_EN.md ├── src ├── morse.rs └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /target 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM rust:alpine as build 2 | RUN apk add --no-cache alpine-sdk 3 | RUN mkdir /app 4 | COPY . /app 5 | RUN --mount=type=cache,target=/root/.cargo/registry \ 6 | --mount=type=cache,target=/app/target \ 7 | cd /app && cargo build --release && \ 8 | cp /app/target/release/isodd / 9 | 10 | 11 | FROM alpine 12 | COPY --from=build /isodd . 13 | ENTRYPOINT [ "/isodd" ] 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | [![logo](https://imgur.com/SzMNZFl.png)](https://isoddapi.studio.site/) 4 | 5 |
6 | 7 | [日本語](./README.md) | [英語](./README_EN.md) 8 | 9 | 1,000,000 までの,アラビア数字,全角アラビア数字,ローマ数字,漢数字の偶数・奇数を判定することができる API です。 10 | 11 | [詳しくはサイトを確認してください。](https://isoddapi.studio.site/) 12 | 13 | ## 使う 14 | 15 | `https://isodd.api.kawaemon.dev/api/isodd` 16 | 17 | 数値の偶奇を取得します. 18 | 19 | ## 試す 20 | 21 | ```bash 22 | curl https://isodd.api.kawaemon.dev/api/isodd/1234 23 | curl https://isodd.api.kawaemon.dev/api/isodd/%E7%99%BE%E4%B8%83%E5%8D%81%E5%9B%9B 24 | ``` 25 | 26 | ※実行には curl が必要です. 27 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "isodd" 3 | version = "0.1.0" 4 | edition = "2018" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | kanaria = "0.2.0" 10 | kanji-number-parser = { git = "https://github.com/kawaemon/kanji-number-parser.git" } 11 | num-bigint = "0.4.0" 12 | once_cell = "1.8.0" 13 | percent-encoding = "2.1.0" 14 | roman = "0.1.6" 15 | serde_json = "1.0.66" 16 | tokio = { version = "1.10.0", features = ["full"] } 17 | tracing = "0.1.26" 18 | tracing-subscriber = "0.2.20" 19 | warp = "0.3.1" 20 | 21 | [profile.release] 22 | lto = "fat" 23 | codegen-units = 1 24 | -------------------------------------------------------------------------------- /README_EN.md: -------------------------------------------------------------------------------- 1 |
2 | 3 | [![logo](https://imgur.com/SzMNZFl.png)](https://isoddapi.studio.site/) 4 | 5 |
6 | 7 | [Japanese](./README.md) | [English](./README_EN.md) 8 | 9 | This API can determine even and odd numbers of Arabic numerals, full-width Arabic numerals, Roman numerals, and Chinese numerals up to 1,000,000. 10 | 11 | [Check the site for details.](https://isoddapi.studio.site/) 12 | 13 | ## Use 14 | 15 | `https://isodd.api.kawaemon.dev/api/isodd` 16 | 17 | Check the site for details. 18 | 19 | ## Try 20 | 21 | ```bash 22 | curl https://isodd.api.kawaemon.dev/api/isodd/1234 23 | curl https://isodd.api.kawaemon.dev/api/isodd/%E7%99%BE%E4%B8%83%E5%8D%81%E5%9B%9B 24 | ``` 25 | 26 | ※ You will need curl to run it. 27 | -------------------------------------------------------------------------------- /src/morse.rs: -------------------------------------------------------------------------------- 1 | use num_bigint::BigUint; 2 | use once_cell::sync::Lazy; 3 | use std::collections::HashMap; 4 | 5 | fn decode_morse(encoded: &str) -> Option { 6 | static TABLE: Lazy> = Lazy::new(|| { 7 | let mut table = HashMap::with_capacity(10); 8 | table.insert([".----", ".-"], "1"); 9 | table.insert(["..---", "..-"], "2"); 10 | table.insert(["...--", "...-"], "3"); 11 | table.insert(["....-", "....-"], "4"); 12 | table.insert([".....", "....."], "5"); 13 | table.insert(["-....", "-...."], "6"); 14 | table.insert(["--...", "-..."], "7"); 15 | table.insert(["---..", "-.."], "8"); 16 | table.insert(["----.", "-."], "9"); 17 | table.insert(["-----", "-"], "0"); 18 | table 19 | }); 20 | 21 | let mut decoded_string: Vec<&'static str> = vec![]; 22 | 23 | for code in encoded.split(' ') { 24 | let v = TABLE.iter().find(|x| x.0.contains(&code))?; 25 | decoded_string.push(*v.1); 26 | } 27 | 28 | Some(decoded_string.join("")) 29 | } 30 | 31 | pub fn morse_code_translate(code: &str) -> Option { 32 | let morse = decode_morse(code.trim())?; 33 | Some(morse.parse().expect("failed to parse decoded digits")) 34 | } 35 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | mod morse; 2 | 3 | use crate::morse::morse_code_translate; 4 | use kanaria::string::UCSStr; 5 | use kanaria::utils::ConvertTarget; 6 | use num_bigint::BigUint; 7 | use percent_encoding::percent_decode; 8 | use serde_json::json; 9 | use std::str::FromStr; 10 | use warp::http::StatusCode; 11 | use warp::reply::{Json, WithStatus}; 12 | use warp::{Filter, Reply}; 13 | 14 | #[tokio::main] 15 | async fn main() { 16 | let port = std::env::var("PORT") 17 | .map(|x| x.parse().expect("PORT is not valid")) 18 | .unwrap_or(3000); 19 | 20 | let use_ansi = std::env::var("NO_COLOR").is_err(); 21 | 22 | tracing_subscriber::fmt() 23 | .with_env_filter(tracing_subscriber::EnvFilter::from_default_env()) 24 | .with_ansi(use_ansi) 25 | .init(); 26 | 27 | let route = warp::path!("api" / "isodd" / String) 28 | .and(warp::header::optional("Authorization")) 29 | .map(service) 30 | .with(warp::trace::request()); 31 | 32 | tracing::info!("starting to serve at port {}", port); 33 | warp::serve(route).bind(([0, 0, 0, 0], port)).await; 34 | } 35 | 36 | fn reply(json: serde_json::Value, status: impl Into>) -> WithStatus { 37 | warp::reply::with_status( 38 | warp::reply::json(&json), 39 | status.into().unwrap_or(StatusCode::OK), 40 | ) 41 | } 42 | 43 | fn service(value: String, auth: Option) -> impl Reply { 44 | // nice security, isn't it? :D 45 | let is_premium = auth.map(|a| a == "Bearer IAMPREMIUMUSER").unwrap_or(false); 46 | 47 | let value = match percent_decode(value.as_bytes()).decode_utf8() { 48 | Ok(v) => v, 49 | Err(_) => return reply(json!({ "error": "URLが不正です" }), None), 50 | }; 51 | 52 | if value.len() >= 1000 { 53 | return reply(json!({ "error": "URLが長過ぎます" }), None); 54 | } 55 | 56 | let result = match is_odd(value) { 57 | Ok(t) => t, 58 | Err(_) => return reply(json!({ "error": "サポートしていない数字形式です" }), None), 59 | }; 60 | 61 | #[allow(non_snake_case)] 62 | let MAX_FREE_VALUE: BigUint = BigUint::from(1_000_000u32); 63 | 64 | if !is_premium && result.parsed_num >= MAX_FREE_VALUE { 65 | return reply( 66 | json!({ 67 | "error": format!("このAPIは、一般ユーザーは絶対値{}未満の数に対してのみ使用できます", MAX_FREE_VALUE), 68 | }), 69 | warp::http::StatusCode::PAYMENT_REQUIRED, 70 | ); 71 | } 72 | 73 | let value_str = 74 | if result.is_negative { "-" } else { "" }.to_string() + &result.parsed_num.to_string(); 75 | 76 | let mut reply_json = serde_json::json!({ 77 | "is_odd": result.is_odd, 78 | "value": value_str, 79 | }); 80 | 81 | if !is_premium { 82 | reply_json.as_object_mut().unwrap().insert( 83 | "ad".into(), 84 | serde_json::Value::String( 85 | "限界開発鯖は主に高専生で構成される開発者コミュニティです。 https://approvers.dev" 86 | .into(), 87 | ), 88 | ); 89 | } 90 | 91 | reply(reply_json, None) 92 | } 93 | 94 | #[derive(PartialEq, Eq, Debug)] 95 | struct IsOddResult { 96 | parsed_num: BigUint, 97 | is_negative: bool, 98 | is_odd: bool, 99 | } 100 | 101 | // Error means parsing error. 102 | // Returns parsed value in 10 radix and whether it is odd number 103 | fn is_odd(num: impl Into) -> Result { 104 | let mut num = num.into(); 105 | let mut is_negative = false; 106 | 107 | if num.starts_with('-') { 108 | num.remove(0); 109 | is_negative = true; 110 | } 111 | 112 | let num = BigUint::from_str(&num) 113 | .or_else(|_| kanji_number_parser::parse(&num)) 114 | .or_else(|_| roman::from(&num).map(|x| BigUint::from(x as u32)).ok_or(())) 115 | .or_else(|_| counting_rod_numerals(&num)) 116 | .or_else(|_| morse_code_translate(&num).ok_or(())) 117 | .or_else(|_| { 118 | BigUint::from_str( 119 | &UCSStr::from_str(&num) 120 | .narrow(ConvertTarget::NUMBER) 121 | .to_string(), 122 | ) 123 | }) 124 | .map_err(|_| ())?; 125 | 126 | let is_odd = num.bit(0); 127 | 128 | Ok(IsOddResult { 129 | parsed_num: num, 130 | is_negative, 131 | is_odd, 132 | }) 133 | } 134 | 135 | #[test] 136 | fn is_odd_test() { 137 | assert_eq!( 138 | is_odd("12345"), 139 | Ok(IsOddResult { 140 | parsed_num: 12345u32.into(), 141 | is_negative: false, 142 | is_odd: true, 143 | }) 144 | ); 145 | assert_eq!( 146 | is_odd("1234"), 147 | Ok(IsOddResult { 148 | parsed_num: 1234u32.into(), 149 | is_negative: false, 150 | is_odd: false, 151 | }) 152 | ); 153 | assert_eq!( 154 | is_odd("-12345"), 155 | Ok(IsOddResult { 156 | parsed_num: 12345u32.into(), 157 | is_negative: true, 158 | is_odd: true, 159 | }) 160 | ); 161 | assert_eq!( 162 | is_odd("-1234"), 163 | Ok(IsOddResult { 164 | parsed_num: 1234u32.into(), 165 | is_negative: true, 166 | is_odd: false, 167 | }) 168 | ); 169 | assert_eq!( 170 | is_odd("千二百三十四"), 171 | Ok(IsOddResult { 172 | parsed_num: 1234u32.into(), 173 | is_negative: false, 174 | is_odd: false, 175 | }) 176 | ); 177 | assert_eq!( 178 | is_odd("千二百三十"), 179 | Ok(IsOddResult { 180 | parsed_num: 1230u32.into(), 181 | is_negative: false, 182 | is_odd: false, 183 | }) 184 | ); 185 | assert_eq!( 186 | is_odd("I"), 187 | Ok(IsOddResult { 188 | parsed_num: 1u32.into(), 189 | is_negative: false, 190 | is_odd: true, 191 | }) 192 | ); 193 | assert_eq!( 194 | is_odd("IV"), 195 | Ok(IsOddResult { 196 | parsed_num: 4u32.into(), 197 | is_negative: false, 198 | is_odd: false, 199 | }) 200 | ); 201 | assert_eq!( 202 | is_odd("1"), 203 | Ok(IsOddResult { 204 | parsed_num: 1u32.into(), 205 | is_negative: false, 206 | is_odd: true, 207 | }) 208 | ); 209 | assert_eq!( 210 | is_odd("4"), 211 | Ok(IsOddResult { 212 | parsed_num: 4u32.into(), 213 | is_negative: false, 214 | is_odd: false, 215 | }) 216 | ); 217 | assert_eq!( 218 | is_odd("𝍤"), 219 | Ok(IsOddResult { 220 | parsed_num: 5u32.into(), 221 | is_negative: false, 222 | is_odd: true, 223 | }) 224 | ); 225 | assert_eq!( 226 | is_odd("𝍠𝍡𝍢𝍣𝍤𝍥𝍦𝍧𝍨𝍩𝍪𝍫𝍬𝍭𝍮𝍯𝍰𝍱𝍲𝍳𝍴𝍵𝍶𝍷𝍸"), 227 | Ok(IsOddResult { 228 | parsed_num: 111u32.into(), 229 | is_negative: false, 230 | is_odd: true, 231 | }) 232 | ); 233 | assert_eq!( 234 | is_odd("𝍶𝍶𝍶𝍵"), 235 | Ok(IsOddResult { 236 | parsed_num: 19u32.into(), 237 | is_negative: false, 238 | is_odd: true, 239 | }) 240 | ); 241 | assert_eq!( 242 | is_odd("𝍧"), 243 | Ok(IsOddResult { 244 | parsed_num: 8u32.into(), 245 | is_negative: false, 246 | is_odd: false, 247 | }) 248 | ); 249 | assert_eq!( 250 | is_odd(".-"), 251 | Ok(IsOddResult { 252 | parsed_num: 1u32.into(), 253 | is_negative: false, 254 | is_odd: true, 255 | }) 256 | ); 257 | assert_eq!( 258 | is_odd(".- .-"), 259 | Ok(IsOddResult { 260 | parsed_num: 11u32.into(), 261 | is_negative: false, 262 | is_odd: true, 263 | }) 264 | ); 265 | 266 | assert_eq!( 267 | is_odd("..-"), 268 | Ok(IsOddResult { 269 | parsed_num: 2u32.into(), 270 | is_negative: false, 271 | is_odd: false, 272 | }) 273 | ); 274 | 275 | assert_eq!( 276 | is_odd(".- .- .- .- .- .- .- .- .- .-"), 277 | Ok(IsOddResult { 278 | parsed_num: 1111111111u32.into(), 279 | is_negative: false, 280 | is_odd: true, 281 | }) 282 | ); 283 | 284 | assert_eq!( 285 | is_odd(".- "), 286 | Ok(IsOddResult { 287 | parsed_num: 1u32.into(), 288 | is_negative: false, 289 | is_odd: true, 290 | }) 291 | ); 292 | 293 | assert_eq!( 294 | is_odd(".----"), 295 | Ok(IsOddResult { 296 | parsed_num: 1u32.into(), 297 | is_negative: false, 298 | is_odd: true, 299 | }) 300 | ); 301 | assert_eq!( 302 | is_odd(".---- ..- ..--- ----. ----- - - ----. ...-- ...-"), 303 | Ok(IsOddResult { 304 | parsed_num: 1229000933u32.into(), 305 | is_negative: false, 306 | is_odd: true, 307 | }) 308 | ); 309 | } 310 | 311 | fn counting_rod_numerals(s: &str) -> Result { 312 | let mut num: u32 = 0; 313 | for c in s.chars() { 314 | num += match c { 315 | '𝍠' => 1, 316 | '𝍡' => 2, 317 | '𝍢' => 3, 318 | '𝍣' => 4, 319 | '𝍤' => 5, 320 | '𝍥' => 6, 321 | '𝍦' => 7, 322 | '𝍧' => 8, 323 | '𝍨' => 9, 324 | '𝍩' => 1, 325 | '𝍪' => 2, 326 | '𝍫' => 3, 327 | '𝍬' => 4, 328 | '𝍭' => 5, 329 | '𝍮' => 6, 330 | '𝍯' => 7, 331 | '𝍰' => 8, 332 | '𝍱' => 9, 333 | '𝍲' => 1, 334 | '𝍳' => 2, 335 | '𝍴' => 3, 336 | '𝍵' => 4, 337 | '𝍶' => 5, 338 | '𝍷' => 1, 339 | '𝍸' => 5, 340 | _ => return Err(()), 341 | } 342 | } 343 | Ok(BigUint::from(num)) 344 | } 345 | -------------------------------------------------------------------------------- /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 = "addr2line" 7 | version = "0.16.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler" 16 | version = "1.0.2" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" 19 | 20 | [[package]] 21 | name = "ansi_term" 22 | version = "0.12.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" 25 | dependencies = [ 26 | "winapi", 27 | ] 28 | 29 | [[package]] 30 | name = "autocfg" 31 | version = "1.0.1" 32 | source = "registry+https://github.com/rust-lang/crates.io-index" 33 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 34 | 35 | [[package]] 36 | name = "backtrace" 37 | version = "0.3.61" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" 40 | dependencies = [ 41 | "addr2line", 42 | "cc", 43 | "cfg-if", 44 | "libc", 45 | "miniz_oxide", 46 | "object", 47 | "rustc-demangle", 48 | ] 49 | 50 | [[package]] 51 | name = "base64" 52 | version = "0.13.0" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 55 | 56 | [[package]] 57 | name = "bitflags" 58 | version = "1.3.2" 59 | source = "registry+https://github.com/rust-lang/crates.io-index" 60 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 61 | 62 | [[package]] 63 | name = "block-buffer" 64 | version = "0.9.0" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 67 | dependencies = [ 68 | "generic-array", 69 | ] 70 | 71 | [[package]] 72 | name = "buf_redux" 73 | version = "0.8.4" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "b953a6887648bb07a535631f2bc00fbdb2a2216f135552cb3f534ed136b9c07f" 76 | dependencies = [ 77 | "memchr", 78 | "safemem", 79 | ] 80 | 81 | [[package]] 82 | name = "byteorder" 83 | version = "1.4.3" 84 | source = "registry+https://github.com/rust-lang/crates.io-index" 85 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 86 | 87 | [[package]] 88 | name = "bytes" 89 | version = "1.0.1" 90 | source = "registry+https://github.com/rust-lang/crates.io-index" 91 | checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" 92 | 93 | [[package]] 94 | name = "cc" 95 | version = "1.0.69" 96 | source = "registry+https://github.com/rust-lang/crates.io-index" 97 | checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" 98 | 99 | [[package]] 100 | name = "cfg-if" 101 | version = "1.0.0" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 104 | 105 | [[package]] 106 | name = "chrono" 107 | version = "0.4.19" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" 110 | dependencies = [ 111 | "libc", 112 | "num-integer", 113 | "num-traits", 114 | "winapi", 115 | ] 116 | 117 | [[package]] 118 | name = "cpufeatures" 119 | version = "0.1.5" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" 122 | dependencies = [ 123 | "libc", 124 | ] 125 | 126 | [[package]] 127 | name = "digest" 128 | version = "0.9.0" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 131 | dependencies = [ 132 | "generic-array", 133 | ] 134 | 135 | [[package]] 136 | name = "failure" 137 | version = "0.1.8" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" 140 | dependencies = [ 141 | "backtrace", 142 | "failure_derive", 143 | ] 144 | 145 | [[package]] 146 | name = "failure_derive" 147 | version = "0.1.8" 148 | source = "registry+https://github.com/rust-lang/crates.io-index" 149 | checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" 150 | dependencies = [ 151 | "proc-macro2", 152 | "quote", 153 | "syn", 154 | "synstructure", 155 | ] 156 | 157 | [[package]] 158 | name = "fnv" 159 | version = "1.0.7" 160 | source = "registry+https://github.com/rust-lang/crates.io-index" 161 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 162 | 163 | [[package]] 164 | name = "form_urlencoded" 165 | version = "1.0.1" 166 | source = "registry+https://github.com/rust-lang/crates.io-index" 167 | checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" 168 | dependencies = [ 169 | "matches", 170 | "percent-encoding", 171 | ] 172 | 173 | [[package]] 174 | name = "futures" 175 | version = "0.3.16" 176 | source = "registry+https://github.com/rust-lang/crates.io-index" 177 | checksum = "1adc00f486adfc9ce99f77d717836f0c5aa84965eb0b4f051f4e83f7cab53f8b" 178 | dependencies = [ 179 | "futures-channel", 180 | "futures-core", 181 | "futures-io", 182 | "futures-sink", 183 | "futures-task", 184 | "futures-util", 185 | ] 186 | 187 | [[package]] 188 | name = "futures-channel" 189 | version = "0.3.16" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "74ed2411805f6e4e3d9bc904c95d5d423b89b3b25dc0250aa74729de20629ff9" 192 | dependencies = [ 193 | "futures-core", 194 | "futures-sink", 195 | ] 196 | 197 | [[package]] 198 | name = "futures-core" 199 | version = "0.3.16" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "af51b1b4a7fdff033703db39de8802c673eb91855f2e0d47dcf3bf2c0ef01f99" 202 | 203 | [[package]] 204 | name = "futures-io" 205 | version = "0.3.16" 206 | source = "registry+https://github.com/rust-lang/crates.io-index" 207 | checksum = "0b0e06c393068f3a6ef246c75cdca793d6a46347e75286933e5e75fd2fd11582" 208 | 209 | [[package]] 210 | name = "futures-sink" 211 | version = "0.3.16" 212 | source = "registry+https://github.com/rust-lang/crates.io-index" 213 | checksum = "c0f30aaa67363d119812743aa5f33c201a7a66329f97d1a887022971feea4b53" 214 | 215 | [[package]] 216 | name = "futures-task" 217 | version = "0.3.16" 218 | source = "registry+https://github.com/rust-lang/crates.io-index" 219 | checksum = "bbe54a98670017f3be909561f6ad13e810d9a51f3f061b902062ca3da80799f2" 220 | 221 | [[package]] 222 | name = "futures-util" 223 | version = "0.3.16" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "67eb846bfd58e44a8481a00049e82c43e0ccb5d61f8dc071057cb19249dd4d78" 226 | dependencies = [ 227 | "autocfg", 228 | "futures-core", 229 | "futures-sink", 230 | "futures-task", 231 | "pin-project-lite", 232 | "pin-utils", 233 | "slab", 234 | ] 235 | 236 | [[package]] 237 | name = "generic-array" 238 | version = "0.14.4" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" 241 | dependencies = [ 242 | "typenum", 243 | "version_check", 244 | ] 245 | 246 | [[package]] 247 | name = "getrandom" 248 | version = "0.1.16" 249 | source = "registry+https://github.com/rust-lang/crates.io-index" 250 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 251 | dependencies = [ 252 | "cfg-if", 253 | "libc", 254 | "wasi 0.9.0+wasi-snapshot-preview1", 255 | ] 256 | 257 | [[package]] 258 | name = "getrandom" 259 | version = "0.2.3" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" 262 | dependencies = [ 263 | "cfg-if", 264 | "libc", 265 | "wasi 0.10.2+wasi-snapshot-preview1", 266 | ] 267 | 268 | [[package]] 269 | name = "gimli" 270 | version = "0.25.0" 271 | source = "registry+https://github.com/rust-lang/crates.io-index" 272 | checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" 273 | 274 | [[package]] 275 | name = "h2" 276 | version = "0.3.4" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "d7f3675cfef6a30c8031cf9e6493ebdc3bb3272a3fea3923c4210d1830e6a472" 279 | dependencies = [ 280 | "bytes", 281 | "fnv", 282 | "futures-core", 283 | "futures-sink", 284 | "futures-util", 285 | "http", 286 | "indexmap", 287 | "slab", 288 | "tokio", 289 | "tokio-util", 290 | "tracing", 291 | ] 292 | 293 | [[package]] 294 | name = "hashbrown" 295 | version = "0.11.2" 296 | source = "registry+https://github.com/rust-lang/crates.io-index" 297 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 298 | 299 | [[package]] 300 | name = "headers" 301 | version = "0.3.4" 302 | source = "registry+https://github.com/rust-lang/crates.io-index" 303 | checksum = "f0b7591fb62902706ae8e7aaff416b1b0fa2c0fd0878b46dc13baa3712d8a855" 304 | dependencies = [ 305 | "base64", 306 | "bitflags", 307 | "bytes", 308 | "headers-core", 309 | "http", 310 | "mime", 311 | "sha-1", 312 | "time", 313 | ] 314 | 315 | [[package]] 316 | name = "headers-core" 317 | version = "0.2.0" 318 | source = "registry+https://github.com/rust-lang/crates.io-index" 319 | checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" 320 | dependencies = [ 321 | "http", 322 | ] 323 | 324 | [[package]] 325 | name = "hermit-abi" 326 | version = "0.1.19" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 329 | dependencies = [ 330 | "libc", 331 | ] 332 | 333 | [[package]] 334 | name = "http" 335 | version = "0.2.4" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" 338 | dependencies = [ 339 | "bytes", 340 | "fnv", 341 | "itoa", 342 | ] 343 | 344 | [[package]] 345 | name = "http-body" 346 | version = "0.4.3" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" 349 | dependencies = [ 350 | "bytes", 351 | "http", 352 | "pin-project-lite", 353 | ] 354 | 355 | [[package]] 356 | name = "httparse" 357 | version = "1.5.1" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" 360 | 361 | [[package]] 362 | name = "httpdate" 363 | version = "1.0.1" 364 | source = "registry+https://github.com/rust-lang/crates.io-index" 365 | checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" 366 | 367 | [[package]] 368 | name = "hyper" 369 | version = "0.14.11" 370 | source = "registry+https://github.com/rust-lang/crates.io-index" 371 | checksum = "0b61cf2d1aebcf6e6352c97b81dc2244ca29194be1b276f5d8ad5c6330fffb11" 372 | dependencies = [ 373 | "bytes", 374 | "futures-channel", 375 | "futures-core", 376 | "futures-util", 377 | "h2", 378 | "http", 379 | "http-body", 380 | "httparse", 381 | "httpdate", 382 | "itoa", 383 | "pin-project-lite", 384 | "socket2", 385 | "tokio", 386 | "tower-service", 387 | "tracing", 388 | "want", 389 | ] 390 | 391 | [[package]] 392 | name = "idna" 393 | version = "0.2.3" 394 | source = "registry+https://github.com/rust-lang/crates.io-index" 395 | checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" 396 | dependencies = [ 397 | "matches", 398 | "unicode-bidi", 399 | "unicode-normalization", 400 | ] 401 | 402 | [[package]] 403 | name = "indexmap" 404 | version = "1.7.0" 405 | source = "registry+https://github.com/rust-lang/crates.io-index" 406 | checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" 407 | dependencies = [ 408 | "autocfg", 409 | "hashbrown", 410 | ] 411 | 412 | [[package]] 413 | name = "input_buffer" 414 | version = "0.4.0" 415 | source = "registry+https://github.com/rust-lang/crates.io-index" 416 | checksum = "f97967975f448f1a7ddb12b0bc41069d09ed6a1c161a92687e057325db35d413" 417 | dependencies = [ 418 | "bytes", 419 | ] 420 | 421 | [[package]] 422 | name = "instant" 423 | version = "0.1.10" 424 | source = "registry+https://github.com/rust-lang/crates.io-index" 425 | checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" 426 | dependencies = [ 427 | "cfg-if", 428 | ] 429 | 430 | [[package]] 431 | name = "isodd" 432 | version = "0.1.0" 433 | dependencies = [ 434 | "kanaria", 435 | "kanji-number-parser", 436 | "num-bigint", 437 | "once_cell", 438 | "percent-encoding", 439 | "roman", 440 | "serde_json", 441 | "tokio", 442 | "tracing", 443 | "tracing-subscriber", 444 | "warp", 445 | ] 446 | 447 | [[package]] 448 | name = "itoa" 449 | version = "0.4.7" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 452 | 453 | [[package]] 454 | name = "kanaria" 455 | version = "0.2.0" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "c0f9d9652540055ac4fded998a73aca97d965899077ab1212587437da44196ff" 458 | dependencies = [ 459 | "bitflags", 460 | ] 461 | 462 | [[package]] 463 | name = "kanji-number-parser" 464 | version = "0.1.0" 465 | source = "git+https://github.com/kawaemon/kanji-number-parser.git#ca20610325747ab8d810eab1035a24df1e00afc6" 466 | dependencies = [ 467 | "failure", 468 | "num-bigint", 469 | "num-traits", 470 | ] 471 | 472 | [[package]] 473 | name = "lazy_static" 474 | version = "1.4.0" 475 | source = "registry+https://github.com/rust-lang/crates.io-index" 476 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 477 | 478 | [[package]] 479 | name = "libc" 480 | version = "0.2.100" 481 | source = "registry+https://github.com/rust-lang/crates.io-index" 482 | checksum = "a1fa8cddc8fbbee11227ef194b5317ed014b8acbf15139bd716a18ad3fe99ec5" 483 | 484 | [[package]] 485 | name = "lock_api" 486 | version = "0.4.4" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "0382880606dff6d15c9476c416d18690b72742aa7b605bb6dd6ec9030fbf07eb" 489 | dependencies = [ 490 | "scopeguard", 491 | ] 492 | 493 | [[package]] 494 | name = "log" 495 | version = "0.4.14" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 498 | dependencies = [ 499 | "cfg-if", 500 | ] 501 | 502 | [[package]] 503 | name = "matchers" 504 | version = "0.0.1" 505 | source = "registry+https://github.com/rust-lang/crates.io-index" 506 | checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" 507 | dependencies = [ 508 | "regex-automata", 509 | ] 510 | 511 | [[package]] 512 | name = "matches" 513 | version = "0.1.9" 514 | source = "registry+https://github.com/rust-lang/crates.io-index" 515 | checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" 516 | 517 | [[package]] 518 | name = "memchr" 519 | version = "2.4.1" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 522 | 523 | [[package]] 524 | name = "mime" 525 | version = "0.3.16" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" 528 | 529 | [[package]] 530 | name = "mime_guess" 531 | version = "2.0.3" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" 534 | dependencies = [ 535 | "mime", 536 | "unicase", 537 | ] 538 | 539 | [[package]] 540 | name = "miniz_oxide" 541 | version = "0.4.4" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" 544 | dependencies = [ 545 | "adler", 546 | "autocfg", 547 | ] 548 | 549 | [[package]] 550 | name = "mio" 551 | version = "0.7.13" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" 554 | dependencies = [ 555 | "libc", 556 | "log", 557 | "miow", 558 | "ntapi", 559 | "winapi", 560 | ] 561 | 562 | [[package]] 563 | name = "miow" 564 | version = "0.3.7" 565 | source = "registry+https://github.com/rust-lang/crates.io-index" 566 | checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" 567 | dependencies = [ 568 | "winapi", 569 | ] 570 | 571 | [[package]] 572 | name = "multipart" 573 | version = "0.17.1" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "d050aeedc89243f5347c3e237e3e13dc76fbe4ae3742a57b94dc14f69acf76d4" 576 | dependencies = [ 577 | "buf_redux", 578 | "httparse", 579 | "log", 580 | "mime", 581 | "mime_guess", 582 | "quick-error", 583 | "rand 0.7.3", 584 | "safemem", 585 | "tempfile", 586 | "twoway", 587 | ] 588 | 589 | [[package]] 590 | name = "ntapi" 591 | version = "0.3.6" 592 | source = "registry+https://github.com/rust-lang/crates.io-index" 593 | checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" 594 | dependencies = [ 595 | "winapi", 596 | ] 597 | 598 | [[package]] 599 | name = "num-bigint" 600 | version = "0.4.0" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" 603 | dependencies = [ 604 | "autocfg", 605 | "num-integer", 606 | "num-traits", 607 | ] 608 | 609 | [[package]] 610 | name = "num-integer" 611 | version = "0.1.44" 612 | source = "registry+https://github.com/rust-lang/crates.io-index" 613 | checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" 614 | dependencies = [ 615 | "autocfg", 616 | "num-traits", 617 | ] 618 | 619 | [[package]] 620 | name = "num-traits" 621 | version = "0.2.14" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 624 | dependencies = [ 625 | "autocfg", 626 | ] 627 | 628 | [[package]] 629 | name = "num_cpus" 630 | version = "1.13.0" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" 633 | dependencies = [ 634 | "hermit-abi", 635 | "libc", 636 | ] 637 | 638 | [[package]] 639 | name = "object" 640 | version = "0.26.1" 641 | source = "registry+https://github.com/rust-lang/crates.io-index" 642 | checksum = "ee2766204889d09937d00bfbb7fec56bb2a199e2ade963cab19185d8a6104c7c" 643 | dependencies = [ 644 | "memchr", 645 | ] 646 | 647 | [[package]] 648 | name = "once_cell" 649 | version = "1.8.0" 650 | source = "registry+https://github.com/rust-lang/crates.io-index" 651 | checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" 652 | 653 | [[package]] 654 | name = "opaque-debug" 655 | version = "0.3.0" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 658 | 659 | [[package]] 660 | name = "parking_lot" 661 | version = "0.11.1" 662 | source = "registry+https://github.com/rust-lang/crates.io-index" 663 | checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" 664 | dependencies = [ 665 | "instant", 666 | "lock_api", 667 | "parking_lot_core", 668 | ] 669 | 670 | [[package]] 671 | name = "parking_lot_core" 672 | version = "0.8.3" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" 675 | dependencies = [ 676 | "cfg-if", 677 | "instant", 678 | "libc", 679 | "redox_syscall", 680 | "smallvec", 681 | "winapi", 682 | ] 683 | 684 | [[package]] 685 | name = "percent-encoding" 686 | version = "2.1.0" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" 689 | 690 | [[package]] 691 | name = "pin-project" 692 | version = "1.0.8" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" 695 | dependencies = [ 696 | "pin-project-internal", 697 | ] 698 | 699 | [[package]] 700 | name = "pin-project-internal" 701 | version = "1.0.8" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" 704 | dependencies = [ 705 | "proc-macro2", 706 | "quote", 707 | "syn", 708 | ] 709 | 710 | [[package]] 711 | name = "pin-project-lite" 712 | version = "0.2.7" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" 715 | 716 | [[package]] 717 | name = "pin-utils" 718 | version = "0.1.0" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 721 | 722 | [[package]] 723 | name = "ppv-lite86" 724 | version = "0.2.10" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 727 | 728 | [[package]] 729 | name = "proc-macro2" 730 | version = "1.0.28" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "5c7ed8b8c7b886ea3ed7dde405212185f423ab44682667c8c6dd14aa1d9f6612" 733 | dependencies = [ 734 | "unicode-xid", 735 | ] 736 | 737 | [[package]] 738 | name = "quick-error" 739 | version = "1.2.3" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" 742 | 743 | [[package]] 744 | name = "quote" 745 | version = "1.0.9" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 748 | dependencies = [ 749 | "proc-macro2", 750 | ] 751 | 752 | [[package]] 753 | name = "rand" 754 | version = "0.7.3" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 757 | dependencies = [ 758 | "getrandom 0.1.16", 759 | "libc", 760 | "rand_chacha 0.2.2", 761 | "rand_core 0.5.1", 762 | "rand_hc 0.2.0", 763 | ] 764 | 765 | [[package]] 766 | name = "rand" 767 | version = "0.8.4" 768 | source = "registry+https://github.com/rust-lang/crates.io-index" 769 | checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" 770 | dependencies = [ 771 | "libc", 772 | "rand_chacha 0.3.1", 773 | "rand_core 0.6.3", 774 | "rand_hc 0.3.1", 775 | ] 776 | 777 | [[package]] 778 | name = "rand_chacha" 779 | version = "0.2.2" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 782 | dependencies = [ 783 | "ppv-lite86", 784 | "rand_core 0.5.1", 785 | ] 786 | 787 | [[package]] 788 | name = "rand_chacha" 789 | version = "0.3.1" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 792 | dependencies = [ 793 | "ppv-lite86", 794 | "rand_core 0.6.3", 795 | ] 796 | 797 | [[package]] 798 | name = "rand_core" 799 | version = "0.5.1" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 802 | dependencies = [ 803 | "getrandom 0.1.16", 804 | ] 805 | 806 | [[package]] 807 | name = "rand_core" 808 | version = "0.6.3" 809 | source = "registry+https://github.com/rust-lang/crates.io-index" 810 | checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" 811 | dependencies = [ 812 | "getrandom 0.2.3", 813 | ] 814 | 815 | [[package]] 816 | name = "rand_hc" 817 | version = "0.2.0" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 820 | dependencies = [ 821 | "rand_core 0.5.1", 822 | ] 823 | 824 | [[package]] 825 | name = "rand_hc" 826 | version = "0.3.1" 827 | source = "registry+https://github.com/rust-lang/crates.io-index" 828 | checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" 829 | dependencies = [ 830 | "rand_core 0.6.3", 831 | ] 832 | 833 | [[package]] 834 | name = "redox_syscall" 835 | version = "0.2.10" 836 | source = "registry+https://github.com/rust-lang/crates.io-index" 837 | checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" 838 | dependencies = [ 839 | "bitflags", 840 | ] 841 | 842 | [[package]] 843 | name = "regex" 844 | version = "1.5.4" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" 847 | dependencies = [ 848 | "regex-syntax", 849 | ] 850 | 851 | [[package]] 852 | name = "regex-automata" 853 | version = "0.1.10" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" 856 | dependencies = [ 857 | "regex-syntax", 858 | ] 859 | 860 | [[package]] 861 | name = "regex-syntax" 862 | version = "0.6.25" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 865 | 866 | [[package]] 867 | name = "remove_dir_all" 868 | version = "0.5.3" 869 | source = "registry+https://github.com/rust-lang/crates.io-index" 870 | checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" 871 | dependencies = [ 872 | "winapi", 873 | ] 874 | 875 | [[package]] 876 | name = "roman" 877 | version = "0.1.6" 878 | source = "registry+https://github.com/rust-lang/crates.io-index" 879 | checksum = "d2c543f0c827ae24df93159810fd4bce2d0abe3785bb4c4d68fae3c467d58d9b" 880 | 881 | [[package]] 882 | name = "rustc-demangle" 883 | version = "0.1.20" 884 | source = "registry+https://github.com/rust-lang/crates.io-index" 885 | checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" 886 | 887 | [[package]] 888 | name = "ryu" 889 | version = "1.0.5" 890 | source = "registry+https://github.com/rust-lang/crates.io-index" 891 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 892 | 893 | [[package]] 894 | name = "safemem" 895 | version = "0.3.3" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" 898 | 899 | [[package]] 900 | name = "scoped-tls" 901 | version = "1.0.0" 902 | source = "registry+https://github.com/rust-lang/crates.io-index" 903 | checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" 904 | 905 | [[package]] 906 | name = "scopeguard" 907 | version = "1.1.0" 908 | source = "registry+https://github.com/rust-lang/crates.io-index" 909 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 910 | 911 | [[package]] 912 | name = "serde" 913 | version = "1.0.128" 914 | source = "registry+https://github.com/rust-lang/crates.io-index" 915 | checksum = "1056a0db1978e9dbf0f6e4fca677f6f9143dc1c19de346f22cac23e422196834" 916 | 917 | [[package]] 918 | name = "serde_json" 919 | version = "1.0.66" 920 | source = "registry+https://github.com/rust-lang/crates.io-index" 921 | checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" 922 | dependencies = [ 923 | "itoa", 924 | "ryu", 925 | "serde", 926 | ] 927 | 928 | [[package]] 929 | name = "serde_urlencoded" 930 | version = "0.7.0" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" 933 | dependencies = [ 934 | "form_urlencoded", 935 | "itoa", 936 | "ryu", 937 | "serde", 938 | ] 939 | 940 | [[package]] 941 | name = "sha-1" 942 | version = "0.9.7" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "1a0c8611594e2ab4ebbf06ec7cbbf0a99450b8570e96cbf5188b5d5f6ef18d81" 945 | dependencies = [ 946 | "block-buffer", 947 | "cfg-if", 948 | "cpufeatures", 949 | "digest", 950 | "opaque-debug", 951 | ] 952 | 953 | [[package]] 954 | name = "sharded-slab" 955 | version = "0.1.3" 956 | source = "registry+https://github.com/rust-lang/crates.io-index" 957 | checksum = "740223c51853f3145fe7c90360d2d4232f2b62e3449489c207eccde818979982" 958 | dependencies = [ 959 | "lazy_static", 960 | ] 961 | 962 | [[package]] 963 | name = "signal-hook-registry" 964 | version = "1.4.0" 965 | source = "registry+https://github.com/rust-lang/crates.io-index" 966 | checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" 967 | dependencies = [ 968 | "libc", 969 | ] 970 | 971 | [[package]] 972 | name = "slab" 973 | version = "0.4.4" 974 | source = "registry+https://github.com/rust-lang/crates.io-index" 975 | checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" 976 | 977 | [[package]] 978 | name = "smallvec" 979 | version = "1.6.1" 980 | source = "registry+https://github.com/rust-lang/crates.io-index" 981 | checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" 982 | 983 | [[package]] 984 | name = "socket2" 985 | version = "0.4.1" 986 | source = "registry+https://github.com/rust-lang/crates.io-index" 987 | checksum = "765f090f0e423d2b55843402a07915add955e7d60657db13707a159727326cad" 988 | dependencies = [ 989 | "libc", 990 | "winapi", 991 | ] 992 | 993 | [[package]] 994 | name = "syn" 995 | version = "1.0.75" 996 | source = "registry+https://github.com/rust-lang/crates.io-index" 997 | checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" 998 | dependencies = [ 999 | "proc-macro2", 1000 | "quote", 1001 | "unicode-xid", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "synstructure" 1006 | version = "0.12.5" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "474aaa926faa1603c40b7885a9eaea29b444d1cb2850cb7c0e37bb1a4182f4fa" 1009 | dependencies = [ 1010 | "proc-macro2", 1011 | "quote", 1012 | "syn", 1013 | "unicode-xid", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "tempfile" 1018 | version = "3.2.0" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" 1021 | dependencies = [ 1022 | "cfg-if", 1023 | "libc", 1024 | "rand 0.8.4", 1025 | "redox_syscall", 1026 | "remove_dir_all", 1027 | "winapi", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "thread_local" 1032 | version = "1.1.3" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" 1035 | dependencies = [ 1036 | "once_cell", 1037 | ] 1038 | 1039 | [[package]] 1040 | name = "time" 1041 | version = "0.1.43" 1042 | source = "registry+https://github.com/rust-lang/crates.io-index" 1043 | checksum = "ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438" 1044 | dependencies = [ 1045 | "libc", 1046 | "winapi", 1047 | ] 1048 | 1049 | [[package]] 1050 | name = "tinyvec" 1051 | version = "1.3.1" 1052 | source = "registry+https://github.com/rust-lang/crates.io-index" 1053 | checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" 1054 | dependencies = [ 1055 | "tinyvec_macros", 1056 | ] 1057 | 1058 | [[package]] 1059 | name = "tinyvec_macros" 1060 | version = "0.1.0" 1061 | source = "registry+https://github.com/rust-lang/crates.io-index" 1062 | checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" 1063 | 1064 | [[package]] 1065 | name = "tokio" 1066 | version = "1.10.0" 1067 | source = "registry+https://github.com/rust-lang/crates.io-index" 1068 | checksum = "01cf844b23c6131f624accf65ce0e4e9956a8bb329400ea5bcc26ae3a5c20b0b" 1069 | dependencies = [ 1070 | "autocfg", 1071 | "bytes", 1072 | "libc", 1073 | "memchr", 1074 | "mio", 1075 | "num_cpus", 1076 | "once_cell", 1077 | "parking_lot", 1078 | "pin-project-lite", 1079 | "signal-hook-registry", 1080 | "tokio-macros", 1081 | "winapi", 1082 | ] 1083 | 1084 | [[package]] 1085 | name = "tokio-macros" 1086 | version = "1.3.0" 1087 | source = "registry+https://github.com/rust-lang/crates.io-index" 1088 | checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110" 1089 | dependencies = [ 1090 | "proc-macro2", 1091 | "quote", 1092 | "syn", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "tokio-stream" 1097 | version = "0.1.7" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" 1100 | dependencies = [ 1101 | "futures-core", 1102 | "pin-project-lite", 1103 | "tokio", 1104 | ] 1105 | 1106 | [[package]] 1107 | name = "tokio-tungstenite" 1108 | version = "0.13.0" 1109 | source = "registry+https://github.com/rust-lang/crates.io-index" 1110 | checksum = "e1a5f475f1b9d077ea1017ecbc60890fda8e54942d680ca0b1d2b47cfa2d861b" 1111 | dependencies = [ 1112 | "futures-util", 1113 | "log", 1114 | "pin-project", 1115 | "tokio", 1116 | "tungstenite", 1117 | ] 1118 | 1119 | [[package]] 1120 | name = "tokio-util" 1121 | version = "0.6.7" 1122 | source = "registry+https://github.com/rust-lang/crates.io-index" 1123 | checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" 1124 | dependencies = [ 1125 | "bytes", 1126 | "futures-core", 1127 | "futures-sink", 1128 | "log", 1129 | "pin-project-lite", 1130 | "tokio", 1131 | ] 1132 | 1133 | [[package]] 1134 | name = "tower-service" 1135 | version = "0.3.1" 1136 | source = "registry+https://github.com/rust-lang/crates.io-index" 1137 | checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" 1138 | 1139 | [[package]] 1140 | name = "tracing" 1141 | version = "0.1.26" 1142 | source = "registry+https://github.com/rust-lang/crates.io-index" 1143 | checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" 1144 | dependencies = [ 1145 | "cfg-if", 1146 | "log", 1147 | "pin-project-lite", 1148 | "tracing-attributes", 1149 | "tracing-core", 1150 | ] 1151 | 1152 | [[package]] 1153 | name = "tracing-attributes" 1154 | version = "0.1.15" 1155 | source = "registry+https://github.com/rust-lang/crates.io-index" 1156 | checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" 1157 | dependencies = [ 1158 | "proc-macro2", 1159 | "quote", 1160 | "syn", 1161 | ] 1162 | 1163 | [[package]] 1164 | name = "tracing-core" 1165 | version = "0.1.19" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "2ca517f43f0fb96e0c3072ed5c275fe5eece87e8cb52f4a77b69226d3b1c9df8" 1168 | dependencies = [ 1169 | "lazy_static", 1170 | ] 1171 | 1172 | [[package]] 1173 | name = "tracing-log" 1174 | version = "0.1.2" 1175 | source = "registry+https://github.com/rust-lang/crates.io-index" 1176 | checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" 1177 | dependencies = [ 1178 | "lazy_static", 1179 | "log", 1180 | "tracing-core", 1181 | ] 1182 | 1183 | [[package]] 1184 | name = "tracing-serde" 1185 | version = "0.1.2" 1186 | source = "registry+https://github.com/rust-lang/crates.io-index" 1187 | checksum = "fb65ea441fbb84f9f6748fd496cf7f63ec9af5bca94dd86456978d055e8eb28b" 1188 | dependencies = [ 1189 | "serde", 1190 | "tracing-core", 1191 | ] 1192 | 1193 | [[package]] 1194 | name = "tracing-subscriber" 1195 | version = "0.2.20" 1196 | source = "registry+https://github.com/rust-lang/crates.io-index" 1197 | checksum = "b9cbe87a2fa7e35900ce5de20220a582a9483a7063811defce79d7cbd59d4cfe" 1198 | dependencies = [ 1199 | "ansi_term", 1200 | "chrono", 1201 | "lazy_static", 1202 | "matchers", 1203 | "regex", 1204 | "serde", 1205 | "serde_json", 1206 | "sharded-slab", 1207 | "smallvec", 1208 | "thread_local", 1209 | "tracing", 1210 | "tracing-core", 1211 | "tracing-log", 1212 | "tracing-serde", 1213 | ] 1214 | 1215 | [[package]] 1216 | name = "try-lock" 1217 | version = "0.2.3" 1218 | source = "registry+https://github.com/rust-lang/crates.io-index" 1219 | checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" 1220 | 1221 | [[package]] 1222 | name = "tungstenite" 1223 | version = "0.12.0" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "8ada8297e8d70872fa9a551d93250a9f407beb9f37ef86494eb20012a2ff7c24" 1226 | dependencies = [ 1227 | "base64", 1228 | "byteorder", 1229 | "bytes", 1230 | "http", 1231 | "httparse", 1232 | "input_buffer", 1233 | "log", 1234 | "rand 0.8.4", 1235 | "sha-1", 1236 | "url", 1237 | "utf-8", 1238 | ] 1239 | 1240 | [[package]] 1241 | name = "twoway" 1242 | version = "0.1.8" 1243 | source = "registry+https://github.com/rust-lang/crates.io-index" 1244 | checksum = "59b11b2b5241ba34be09c3cc85a36e56e48f9888862e19cedf23336d35316ed1" 1245 | dependencies = [ 1246 | "memchr", 1247 | ] 1248 | 1249 | [[package]] 1250 | name = "typenum" 1251 | version = "1.13.0" 1252 | source = "registry+https://github.com/rust-lang/crates.io-index" 1253 | checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" 1254 | 1255 | [[package]] 1256 | name = "unicase" 1257 | version = "2.6.0" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" 1260 | dependencies = [ 1261 | "version_check", 1262 | ] 1263 | 1264 | [[package]] 1265 | name = "unicode-bidi" 1266 | version = "0.3.6" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" 1269 | 1270 | [[package]] 1271 | name = "unicode-normalization" 1272 | version = "0.1.19" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" 1275 | dependencies = [ 1276 | "tinyvec", 1277 | ] 1278 | 1279 | [[package]] 1280 | name = "unicode-xid" 1281 | version = "0.2.2" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 1284 | 1285 | [[package]] 1286 | name = "url" 1287 | version = "2.2.2" 1288 | source = "registry+https://github.com/rust-lang/crates.io-index" 1289 | checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" 1290 | dependencies = [ 1291 | "form_urlencoded", 1292 | "idna", 1293 | "matches", 1294 | "percent-encoding", 1295 | ] 1296 | 1297 | [[package]] 1298 | name = "utf-8" 1299 | version = "0.7.6" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 1302 | 1303 | [[package]] 1304 | name = "version_check" 1305 | version = "0.9.3" 1306 | source = "registry+https://github.com/rust-lang/crates.io-index" 1307 | checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" 1308 | 1309 | [[package]] 1310 | name = "want" 1311 | version = "0.3.0" 1312 | source = "registry+https://github.com/rust-lang/crates.io-index" 1313 | checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" 1314 | dependencies = [ 1315 | "log", 1316 | "try-lock", 1317 | ] 1318 | 1319 | [[package]] 1320 | name = "warp" 1321 | version = "0.3.1" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "332d47745e9a0c38636dbd454729b147d16bd1ed08ae67b3ab281c4506771054" 1324 | dependencies = [ 1325 | "bytes", 1326 | "futures", 1327 | "headers", 1328 | "http", 1329 | "hyper", 1330 | "log", 1331 | "mime", 1332 | "mime_guess", 1333 | "multipart", 1334 | "percent-encoding", 1335 | "pin-project", 1336 | "scoped-tls", 1337 | "serde", 1338 | "serde_json", 1339 | "serde_urlencoded", 1340 | "tokio", 1341 | "tokio-stream", 1342 | "tokio-tungstenite", 1343 | "tokio-util", 1344 | "tower-service", 1345 | "tracing", 1346 | ] 1347 | 1348 | [[package]] 1349 | name = "wasi" 1350 | version = "0.9.0+wasi-snapshot-preview1" 1351 | source = "registry+https://github.com/rust-lang/crates.io-index" 1352 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1353 | 1354 | [[package]] 1355 | name = "wasi" 1356 | version = "0.10.2+wasi-snapshot-preview1" 1357 | source = "registry+https://github.com/rust-lang/crates.io-index" 1358 | checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" 1359 | 1360 | [[package]] 1361 | name = "winapi" 1362 | version = "0.3.9" 1363 | source = "registry+https://github.com/rust-lang/crates.io-index" 1364 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1365 | dependencies = [ 1366 | "winapi-i686-pc-windows-gnu", 1367 | "winapi-x86_64-pc-windows-gnu", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "winapi-i686-pc-windows-gnu" 1372 | version = "0.4.0" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1375 | 1376 | [[package]] 1377 | name = "winapi-x86_64-pc-windows-gnu" 1378 | version = "0.4.0" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1381 | --------------------------------------------------------------------------------