diff --git a/.github/actions/cache_cargo/action.yml b/.github/actions/cache_cargo/action.yml index 35e21b9..cf7c258 100644 --- a/.github/actions/cache_cargo/action.yml +++ b/.github/actions/cache_cargo/action.yml @@ -5,7 +5,7 @@ runs: steps: - name: Cache cargo registry - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: | ~/.cargo/bin/ diff --git a/Cargo.lock b/Cargo.lock index 60c0d0a..97648ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ac-ninja" @@ -18,6 +18,7 @@ dependencies = [ "scraper", "serde", "shellexpand", + "time 0.3.47", "tokio", "toml", ] @@ -145,7 +146,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -204,7 +205,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" dependencies = [ "percent-encoding", - "time 0.3.20", + "time 0.3.47", "version_check", ] @@ -220,7 +221,7 @@ dependencies = [ "publicsuffix", "serde", "serde_json", - "time 0.3.20", + "time 0.3.47", "url", ] @@ -254,7 +255,7 @@ dependencies = [ "proc-macro2", "quote", "smallvec", - "syn", + "syn 1.0.109", ] [[package]] @@ -264,7 +265,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfae75de57f2b2e85e8768c3ea840fd159c8f33e2b6522c7835b7abac81be16e" dependencies = [ "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -312,7 +313,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 1.0.109", ] [[package]] @@ -329,7 +330,16 @@ checksum = "0b75aed41bb2e6367cae39e6326ef817a851db13c13e4f3263714ca3cfb8de56" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", +] + +[[package]] +name = "deranged" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" +dependencies = [ + "powerfmt", ] [[package]] @@ -342,7 +352,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 1.0.109", ] [[package]] @@ -644,7 +654,7 @@ dependencies = [ "markup5ever", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -969,6 +979,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "num-conv" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" + [[package]] name = "num-integer" version = "0.1.45" @@ -1033,7 +1049,7 @@ checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1160,7 +1176,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1205,6 +1221,12 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26f6a7b87c2e435a3241addceeeff740ff8b7e76b74c13bf9acb17fa454ea00b" +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1240,7 +1262,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1263,9 +1285,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.51" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d727cae5b39d21da60fa540906919ad737832fe0b1c165da3a34d6548c849d6" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ "unicode-ident", ] @@ -1288,9 +1310,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.23" +version = "1.0.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" dependencies = [ "proc-macro2", ] @@ -1575,22 +1597,32 @@ checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" [[package]] name = "serde" -version = "1.0.153" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a382c72b4ba118526e187430bb4963cd6d55051ebf13d9b25574d379cc98d20" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.153" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ef476a5790f0f6decbc66726b6e5d63680ed518283e64c7df415989d880954f" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.114", ] [[package]] @@ -1730,6 +1762,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "2.0.114" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tempfile" version = "3.4.0" @@ -1797,7 +1840,7 @@ checksum = "5420d42e90af0c38c3290abcca25b9b3bdf379fc9f55c528f53a269d9c9a267e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -1813,28 +1856,32 @@ dependencies = [ [[package]] name = "time" -version = "0.3.20" +version = "0.3.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" dependencies = [ + "deranged", "itoa 1.0.6", - "serde", + "num-conv", + "powerfmt", + "serde_core", "time-core", "time-macros", ] [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" [[package]] name = "time-macros" -version = "0.2.8" +version = "0.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" dependencies = [ + "num-conv", "time-core", ] @@ -1879,7 +1926,7 @@ checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] @@ -2077,7 +2124,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-shared", ] @@ -2111,7 +2158,7 @@ checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/Cargo.toml b/Cargo.toml index 07fdda1..c8c6d37 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,4 @@ reqwest = { version = "0.11.14", features = ["cookies", "json"] } dialoguer = "0.10.3" indicatif = "0.17.3" chrono = "0.4.23" +time = "0.3.36" diff --git a/LANG_ID.md b/LANG_ID.md index 3c5b463..d6387d0 100644 --- a/LANG_ID.md +++ b/LANG_ID.md @@ -2,93 +2,119 @@ | language_name | language_id | | :---: | :---: | -| "C++ 20 (gcc 12.2)" | 5001 | -| "Go (go 1.20.6)" | 5002 | -| "C# 11.0 (.NET 7.0.7)" | 5003 | -| "Kotlin (Kotlin/JVM 1.8.20)" | 5004 | -| "Java (OpenJDK 17)" | 5005 | -| "Nim (Nim 1.6.14)" | 5006 | -| "V (V 0.4)" | 5007 | -| "Zig (Zig 0.10.1)" | 5008 | -| "JavaScript (Node.js 18.16.1)" | 5009 | -| "JavaScript (Deno 1.35.1)" | 5010 | -| "R (GNU R 4.2.1)" | 5011 | -| "D (DMD 2.104.0)" | 5012 | -| "D (LDC 1.32.2)" | 5013 | -| "Swift (swift 5.8.1)" | 5014 | -| "Dart (Dart 3.0.5)" | 5015 | -| "PHP (php 8.2.8)" | 5016 | -| "C (gcc 12.2.0)" | 5017 | -| "Ruby (ruby 3.2.2)" | 5018 | -| "Crystal (Crystal 1.9.1)" | 5019 | -| "Brainfuck (bf 20041219)" | 5020 | -| "F# 7.0 (.NET 7.0.7)" | 5021 | -| "Julia (Julia 1.9.2)" | 5022 | -| "Bash (bash 5.2.2)" | 5023 | -| "Text (cat 8.32)" | 5024 | -| "Haskell (GHC 9.4.5)" | 5025 | -| "Fortran (gfortran 12.2)" | 5026 | -| "Lua (LuaJIT 2.1.0-beta3)" | 5027 | -| "C++ 23 (gcc 12.2)" | 5028 | -| "Common Lisp (SBCL 2.3.6)" | 5029 | -| "COBOL (Free) (GnuCOBOL 3.1.2)" | 5030 | -| "C++ 23 (Clang 16.0.5)" | 5031 | -| "Zsh (Zsh 5.9)" | 5032 | -| "SageMath (SageMath 9.5)" | 5033 | -| "Sed (GNU sed 4.8)" | 5034 | -| "bc (bc 1.07.1)" | 5035 | -| "dc (dc 1.07.1)" | 5036 | -| "Perl (perl 5.34)" | 5037 | -| "AWK (GNU Awk 5.0.1)" | 5038 | -| "なでしこ (cnako3 3.4.20)" | 5039 | -| "Assembly x64 (NASM 2.15.05)" | 5040 | -| "Pascal (fpc 3.2.2)" | 5041 | -| "C# 11.0 AOT (.NET 7.0.7)" | 5042 | -| "Lua (Lua 5.4.6)" | 5043 | -| "Prolog (SWI-Prolog 9.0.4)" | 5044 | -| "PowerShell (PowerShell 7.3.1)" | 5045 | -| "Scheme (Gauche 0.9.12)" | 5046 | -| "Scala 3.3.0 (Scala Native 0.4.14)" | 5047 | -| "Visual Basic 16.9 (.NET 7.0.7)" | 5048 | -| "Forth (gforth 0.7.3)" | 5049 | -| "Clojure (babashka 1.3.181)" | 5050 | -| "Erlang (Erlang 26.0.2)" | 5051 | -| "TypeScript 5.1 (Deno 1.35.1)" | 5052 | -| "C++ 17 (gcc 12.2)" | 5053 | -| "Rust (rustc 1.70.0)" | 5054 | -| "Python (CPython 3.11.4)" | 5055 | -| "Scala (Dotty 3.3.0)" | 5056 | -| "Koka (koka 2.4.0)" | 5057 | -| "TypeScript 5.1 (Node.js 18.16.1)" | 5058 | -| "OCaml (ocamlopt 5.0.0)" | 5059 | -| "Raku (Rakudo 2023.06)" | 5060 | -| "Vim (vim 9.0.0242)" | 5061 | -| "Emacs Lisp (Native Compile) (GNU Emacs 28.2)" | 5062 | -| "Python (Mambaforge / CPython 3.10.10)" | 5063 | -| "Clojure (clojure 1.11.1)" | 5064 | -| "プロデル (mono版プロデル 1.9.1182)" | 5065 | -| "ECLiPSe (ECLiPSe 7.1_13)" | 5066 | -| "Nibbles (literate form) (nibbles 1.01)" | 5067 | -| "Ada (GNAT 12.2)" | 5068 | -| "jq (jq 1.6)" | 5069 | -| "Cyber (Cyber v0.2-Latest)" | 5070 | -| "Carp (Carp 0.5.5)" | 5071 | -| "C++ 17 (Clang 16.0.5)" | 5072 | -| "C++ 20 (Clang 16.0.5)" | 5073 | -| "LLVM IR (Clang 16.0.5)" | 5074 | -| "Emacs Lisp (Byte Compile) (GNU Emacs 28.2)" | 5075 | -| "Factor (Factor 0.98)" | 5076 | -| "D (GDC 12.2)" | 5077 | -| "Python (PyPy 3.10-v7.3.12)" | 5078 | -| "Whitespace (whitespacers 1.0.0)" | 5079 | -| "><> (fishr 0.1.0)" | 5080 | -| "ReasonML (reason 3.9.0)" | 5081 | -| "Python (Cython 0.29.34)" | 5082 | -| "Octave (GNU Octave 8.2.0)" | 5083 | -| "Haxe (JVM) (Haxe 4.3.1)" | 5084 | -| "Elixir (Elixir 1.15.2)" | 5085 | -| "Mercury (Mercury 22.01.6)" | 5086 | -| "Seed7 (Seed7 3.2.1)" | 5087 | -| "Emacs Lisp (No Compile) (GNU Emacs 28.2)" | 5088 | -| "Unison (Unison M5b)" | 5089 | -| "COBOL (GnuCOBOL(Fixed) 3.1.2)" | 5090 | +| "><> (fishr 0.1.0)" | 6001 | +| "Ada 2022 (GNAT 15.2.0)" | 6002 | +| "APL (GNU APL 1.9)" | 6003 | +| "Assembly MIPS O32 ABI (GNU assembler 2.42)" | 6004 | +| "Assembly x64 (NASM 2.16.03)" | 6005 | +| "AWK (GNU awk 5.2.1)" | 6006 | +| "A言語 (interpreter af48a2a)" | 6007 | +| "Bash (bash 5.3)" | 6008 | +| "BASIC (FreeBASIC 1.10.1)" | 6009 | +| "bc (GNU bc 1.08.2)" | 6010 | +| "Befunge93 (TBC 1.0)" | 6011 | +| "Brainfuck (Tritium 1.2.73)" | 6012 | +| "C23 (Clang 21.1.0)" | 6013 | +| "C23 (GCC 14.2.0)" | 6014 | +| "C# 13.0 (.NET 9.0.8)" | 6015 | +| "C# 13.0 (.NET Native AOT 9.0.8)" | 6016 | +| "C++23 (GCC 15.2.0)" | 6017 | +| "C3 (c3c 0.7.5)" | 6018 | +| "Carp(Carp 0.5.5)" | 6019 | +| "cLay (cLay 20250308-1 (GCC 15.2.0))" | 6020 | +| "Clojure (babashka 1.12.208)" | 6021 | +| "Clojure (clojure 1.12.2)" | 6022 | +| "Clojure (Clojure AOT 1.12.2)" | 6023 | +| "Clojure (ClojureScript 1.12.42 (Clojure 1.12.2 Node.js 22.19.0))" | 6025 | +| "COBOL (Free) (GnuCOBOL 3.2)" | 6026 | +| "Common Lisp (SBCL 2.5.8)" | 6027 | +| "Crystal (Crystal 1.17.0)" | 6028 | +| "Cyber (Cyber v0.3)" | 6029 | +| "D (DMD 2.111.0)" | 6030 | +| "D (GDC 15.2)" | 6031 | +| "D (LDC 1.41.0)" | 6032 | +| "Dart (Dart 3.9.2)" | 6033 | +| "dc 1.5.2 (GNU bc 1.08.2)" | 6034 | +| "ECLiPSe (ECLiPSe 7.1_13)" | 6035 | +| "Eiffel (Gobo Eiffel 22.01)" | 6036 | +| "Eiffel (Liberty Eiffel 07829e3)" | 6037 | +| "Elixir (Elixir 1.18.4 (OTP 28.0.2))" | 6038 | +| "Emacs Lisp(Native Compile)(GNU Emacs 29.4)" | 6039 | +| "Emojicode 1.0 beta 2 (emojicodec 1.0 beta 2)" | 6040 | +| "Erlang (Erlang 28.0.2)" | 6041 | +| "F# 9.0 (.NET 9.0.8)" | 6042 | +| "Factor (Factor 0.100)" | 6043 | +| "Fish (fish 4.0.2)" | 6044 | +| "Forth (gforth 0.7.3)" | 6045 | +| "Fortran2018 (Flang 20.1.7)" | 6046 | +| "Fortran2023 (GCC 14.2.0)" | 6047 | +| "FORTRAN77 (GCC 14.2.0)" | 6048 | +| "Gleam (Gleam 1.12.0 (OTP 28.0.2))" | 6049 | +| "Go 1.18 (gccgo 15.2.0)" | 6050 | +| "Go (go 1.25.1)" | 6051 | +| "Haskell (GHC 9.8.4)" | 6052 | +| "Haxe/JVM 4.3.7 (hxjava 4.2.0)" | 6053 | +| "C++ IOI-Style(GNU++20) (GCC 14.2.0)" | 6054 | +| "ISLisp (Easy-ISLisp 5.43)" | 6055 | +| "Java24 (OpenJDK 24.0.2)" | 6056 | +| "JavaScript (Bun 1.2.21)" | 6057 | +| "JavaScript (Deno 2.4.5)" | 6058 | +| "JavaScript (Node.js 22.19.0)" | 6059 | +| "Jule (jule 0.1.6)" | 6060 | +| "Koka (koka v3.2.2)" | 6061 | +| "Kotlin (Kotlin/JVM 2.2.10)" | 6062 | +| "Kuin (kuincl v.2021.8.17)" | 6063 | +| "Lazy K (irori v1.0.0)" | 6064 | +| "Lean (lean v4.22.0)" | 6065 | +| "LLVM IR (Clang 21.1.0)" | 6066 | +| "Lua (Lua 5.4.7)" | 6067 | +| "Lua (LuaJIT 2.1.1703358377)" | 6068 | +| "Mercury (Mercury 22.01.8)" | 6069 | +| "Nim (Nim 1.6.20)" | 6071 | +| "Nim (Nim 2.2.4)" | 6072 | +| "OCaml (ocamlopt 5.3.0)" | 6073 | +| "Octave (GNU Octave 10.2.0)" | 6074 | +| "Pascal (fpc 3.2.2)" | 6075 | +| "Perl (perl 5.38.2)" | 6076 | +| "PHP (PHP 8.4.12)" | 6077 | +| "Piet (your-diary/piet_programming_language 3.0.0) (PPM image)" | 6078 | +| "Pony (ponyc 0.59.0)" | 6079 | +| "PowerShell (PowerShell 7.5.2)" | 6080 | +| "Prolog (SWI-Prolog 9.2.9)" | 6081 | +| "Python (CPython 3.13.7)" | 6082 | +| "Python (PyPy 3.11-v7.3.20)" | 6083 | +| "R (GNU R 4.5.0)" | 6084 | +| "ReasonML (reson 3.16.0)" | 6085 | +| "Ruby 3.3 (truffleruby 25.0.0)" | 6086 | +| "Ruby 3.4 (ruby 3.4.5)" | 6087 | +| "Rust (rustc 1.89.0)" | 6088 | +| "SageMath (SageMath 10.7)" | 6089 | +| "Scala (Dotty 3.7.2)" | 6090 | +| "Scala 3.7.2 (Scala Native 0.5.8)" | 6091 | +| "Scheme (ChezScheme 10.2.0)" | 6092 | +| "Scheme (Gauche 0.9.15)" | 6093 | +| "Seed7 (Seed7 3.5.0)" | 6094 | +| "Swift 6.2" | 6095 | +| "Tcl (tclsh 9.0.1)" | 6096 | +| "Terra (Terra 1.2.0)" | 6097 | +| "TeX (tex 3.141592653)" | 6098 | +| "Text (cat 9.4)" | 6099 | +| "TypeScript 5.8 (Deno 2.4.5)" | 6100 | +| "TypeScript 5.9 (tsc 5.9.2 (Bun 1.2.21))" | 6101 | +| "TypeScript 5.9 (tsc 5.9.2 (Node.js 22.19.0))" | 6102 | +| "Uiua (uiua 0.16.2)" | 6103 | +| "Unison (Unison 0.5.47)" | 6104 | +| "V (0.4.10)" | 6105 | +| "Vala (valac 0.56.18)" | 6106 | +| "Verilog 2012 (Icarus Verilog 12.0)" | 6107 | +| "Veryl (veryl 0.16.4)" | 6108 | +| "WebAssembly (wabt 1.0.34 + iwasm 2.4.1)" | 6109 | +| "Whitespace (whitespacers 1.3.0)" | 6110 | +| "Zig (Zig 0.15.1)" | 6111 | +| "なでしこ (cnako3 3.7.8 (Node.js 22.19.0))" | 6112 | +| "プロデル (mono版プロデル 2.0.1353)" | 6113 | +| "Julia (Julia 1.11.6)" | 6114 | +| "Python (Codon 0.19.3)" | 6115 | +| "C++23 (Clang 21.1.0)" | 6116 | +| "Fix (1.1.0-alpha.12)" | 6117 | +| "SQL (DuckDB 1.3.2)" | 6118 | diff --git a/src/ac_scraper.rs b/src/ac_scraper.rs index fabd19c..91e6b7c 100644 --- a/src/ac_scraper.rs +++ b/src/ac_scraper.rs @@ -66,7 +66,7 @@ pub async fn add_task_name_to_problem_info( let body = acn .client .get(tasks_url.clone()) - .headers(acn.cookies.clone().unwrap_or(HeaderMap::new())) + .headers(acn.cookies.clone().unwrap_or_default()) .send() .await? .error_for_status()? @@ -98,7 +98,7 @@ pub async fn add_task_name_to_problem_info( let now_idx = problem_id_to_index(&id)?; let config_idx = problem_id_to_index(config_id)?; if now_idx == config_idx { - let task_screen_name: String = href.split('/').last().unwrap().to_string(); + let task_screen_name: String = href.split('/').next_back().unwrap().to_string(); problem_info.task_screen_name = task_screen_name.clone(); problem_str_info.insert("task_screen_name".to_string(), task_screen_name); return Ok((problem_info, problem_str_info)); @@ -116,7 +116,7 @@ async fn get_csrf_token(acn: &ACN, url: &str) -> Result { let login_body = acn .client .get(url) - .headers(acn.cookies.clone().unwrap_or(HeaderMap::new())) + .headers(acn.cookies.clone().unwrap_or_default()) .send() .await? .error_for_status()? @@ -184,7 +184,7 @@ pub async fn ac_login(acn: &ACN) -> Result<()> { let resp = acn .client .post(LOGIN_URL) - .headers(acn.cookies.clone().unwrap_or(HeaderMap::new())) + .headers(acn.cookies.clone().unwrap_or_default()) .form(¶ms) .send() .await?; @@ -352,7 +352,7 @@ pub async fn ac_submit( let submit_file = str_format(config_str_map["source_file_path"].clone(), &data_map); println!("{}{}", "Submit file: ".green(), submit_file); - let source = fs::read(&full(&submit_file).unwrap().to_string()) + let source = fs::read(full(&submit_file).unwrap().to_string()) .with_context(|| format!("Failed to read {}", submit_file))?; let source_str = String::from_utf8_lossy(&source); @@ -381,7 +381,7 @@ pub async fn ac_submit( let resp = acn .client .post(submit_url.as_str()) - .headers(acn.cookies.clone().unwrap_or(HeaderMap::new())) + .headers(acn.cookies.clone().unwrap_or_default()) .form(¶ms) .send() .await?; @@ -426,12 +426,13 @@ pub async fn ac_submit( let mut finish = false; let mut finish_msg = String::from(""); let mut timeout_cnt = 0; + let status_re = Regex::new(r"^(\d+) */ *(\d+) *(.*)$").unwrap(); while !finish { let submissions_url = str_format(SUBMISSIONS_URL.to_string(), &data_map); let req = acn .client .get(submissions_url) - .headers(acn.cookies.clone().unwrap_or(HeaderMap::new())) + .headers(acn.cookies.clone().unwrap_or_default()) .timeout(tokio::time::Duration::from_millis(2000)); let resp = req.send().await; @@ -464,24 +465,17 @@ pub async fn ac_submit( let doc = Html::parse_document(&body.unwrap()); - finish_msg = if submission_id.is_none() { - let tr_selector = Selector::parse("table tbody tr").unwrap(); - let latest_row = doc.select(&tr_selector).next().unwrap(); - let submission = get_submission_info_from_row(&latest_row)?; - submission_id = Some(submission.id.parse::().unwrap()); + finish_msg = if let Some(submission_id_value) = submission_id { + let td_selector = + Selector::parse(format!("td[data-id=\"{}\"]", submission_id_value).as_str()) + .unwrap(); + let target_row = + ElementRef::wrap(doc.select(&td_selector).next().unwrap().parent().unwrap()) + .unwrap(); + let submission = get_submission_info_from_row(&target_row)?; let status = Status::from_table_str(&submission.status_str); - if status != Status::WJ { - let style = match status { - Status::AC => bar_green_style.clone(), - Status::WA => bar_red_style.clone(), - _ => bar_yellow_style.clone(), - }; - pb.set_style(style); - pb.tick(); - } if status.as_str() != submission.status_str { - let re = Regex::new(r"^(\d+) */ *(\d+) *(.*)$").unwrap(); - if let Some(caps) = re.captures(&submission.status_str) { + if let Some(caps) = status_re.captures(&submission.status_str) { done = caps.get(1).unwrap().as_str().parse::().unwrap(); all = caps.get(2).unwrap().as_str().parse::().unwrap(); pb.set_length(all); @@ -490,6 +484,15 @@ pub async fn ac_submit( } else if status != Status::WJ { finish = true; } + if status != Status::WJ { + let style = match status { + Status::AC => bar_green_style.clone(), + Status::WA => bar_red_style.clone(), + _ => bar_yellow_style.clone(), + }; + pb.set_style(style); + pb.tick(); + } let msg = format!( "{} [ {} ]\n", make_submission_display(&submission), @@ -499,25 +502,11 @@ pub async fn ac_submit( pb.set_message(msg.clone()); msg } else { - let td_selector = - Selector::parse(format!("td[data-id=\"{}\"]", submission_id.unwrap()).as_str()) - .unwrap(); - let target_row = - ElementRef::wrap(doc.select(&td_selector).next().unwrap().parent().unwrap()) - .unwrap(); - let submission = get_submission_info_from_row(&target_row)?; + let tr_selector = Selector::parse("table tbody tr").unwrap(); + let latest_row = doc.select(&tr_selector).next().unwrap(); + let submission = get_submission_info_from_row(&latest_row)?; + submission_id = Some(submission.id.parse::().unwrap()); let status = Status::from_table_str(&submission.status_str); - if status.as_str() != submission.status_str { - let re = Regex::new(r"^(\d+) */ *(\d+) *(.*)$").unwrap(); - if let Some(caps) = re.captures(&submission.status_str) { - done = caps.get(1).unwrap().as_str().parse::().unwrap(); - all = caps.get(2).unwrap().as_str().parse::().unwrap(); - pb.set_length(all); - pb.set_position(done); - } - } else if status != Status::WJ { - finish = true; - } if status != Status::WJ { let style = match status { Status::AC => bar_green_style.clone(), @@ -527,6 +516,16 @@ pub async fn ac_submit( pb.set_style(style); pb.tick(); } + if status.as_str() != submission.status_str { + if let Some(caps) = status_re.captures(&submission.status_str) { + done = caps.get(1).unwrap().as_str().parse::().unwrap(); + all = caps.get(2).unwrap().as_str().parse::().unwrap(); + pb.set_length(all); + pb.set_position(done); + } + } else if status != Status::WJ { + finish = true; + } let msg = format!( "{} [ {} ]\n", make_submission_display(&submission), @@ -556,7 +555,7 @@ pub async fn get_sample_cases( let body = acn .client .get(problem_url) - .headers(acn.cookies.clone().unwrap_or(HeaderMap::new())) + .headers(acn.cookies.clone().unwrap_or_default()) .send() .await? .error_for_status()? @@ -604,8 +603,7 @@ pub async fn get_sample_cases( outputs.push((index, pre_content.into())); } } - if sample_case_id_arg.is_some() { - let target = sample_case_id_arg.unwrap(); + if let Some(target) = sample_case_id_arg { inputs.retain(|x| x.0 == target); outputs.retain(|x| x.0 == target); } diff --git a/src/check_samples.rs b/src/check_samples.rs index 155d89c..5e7553d 100644 --- a/src/check_samples.rs +++ b/src/check_samples.rs @@ -75,11 +75,13 @@ pub struct FailedDetail { pub index: usize, pub input: String, pub expected: String, + #[allow(dead_code)] pub status: Status, pub output: String, } pub struct SampleResults { + #[allow(dead_code)] pub size: usize, pub total_status: Status, pub failed_details: Vec, diff --git a/src/config.rs b/src/config.rs index 47045a9..2334575 100644 --- a/src/config.rs +++ b/src/config.rs @@ -218,6 +218,7 @@ fn toml_into_config_vector(arr: Vec, mut config_vector: ConfigVecto } #[derive(Debug, Serialize, Deserialize, Clone)] +#[allow(dead_code)] pub struct Config { pub work_space: Option, pub abc_dir_name: Option, @@ -304,10 +305,10 @@ pub async fn get_problem_info_from_path( } } - if contest_type.is_some() && contest_id.is_some() { + if let (Some(contest_type), Some(contest_id)) = (contest_type.as_deref(), contest_id) { let problem_info = ProblemInfo { - contest_type: ContestType::from_str(contest_type.unwrap().as_str()).unwrap(), - contest_id: contest_id.unwrap(), + contest_type: ContestType::from_str(contest_type).unwrap(), + contest_id, problem_id, task_screen_name: "".into(), }; diff --git a/src/language_id.rs b/src/language_id.rs index f5da728..1c43d74 100644 --- a/src/language_id.rs +++ b/src/language_id.rs @@ -2,96 +2,122 @@ use anyhow::{anyhow, Result}; pub fn lang_to_id(lang_name: &str) -> Result { match lang_name { - "C++ 20 (gcc 12.2)" => Ok(5001), - "Go (go 1.20.6)" => Ok(5002), - "C# 11.0 (.NET 7.0.7)" => Ok(5003), - "Kotlin (Kotlin/JVM 1.8.20)" => Ok(5004), - "Java (OpenJDK 17)" => Ok(5005), - "Nim (Nim 1.6.14)" => Ok(5006), - "V (V 0.4)" => Ok(5007), - "Zig (Zig 0.10.1)" => Ok(5008), - "JavaScript (Node.js 18.16.1)" => Ok(5009), - "JavaScript (Deno 1.35.1)" => Ok(5010), - "R (GNU R 4.2.1)" => Ok(5011), - "D (DMD 2.104.0)" => Ok(5012), - "D (LDC 1.32.2)" => Ok(5013), - "Swift (swift 5.8.1)" => Ok(5014), - "Dart (Dart 3.0.5)" => Ok(5015), - "PHP (php 8.2.8)" => Ok(5016), - "C (gcc 12.2.0)" => Ok(5017), - "Ruby (ruby 3.2.2)" => Ok(5018), - "Crystal (Crystal 1.9.1)" => Ok(5019), - "Brainfuck (bf 20041219)" => Ok(5020), - "F# 7.0 (.NET 7.0.7)" => Ok(5021), - "Julia (Julia 1.9.2)" => Ok(5022), - "Bash (bash 5.2.2)" => Ok(5023), - "Text (cat 8.32)" => Ok(5024), - "Haskell (GHC 9.4.5)" => Ok(5025), - "Fortran (gfortran 12.2)" => Ok(5026), - "Lua (LuaJIT 2.1.0-beta3)" => Ok(5027), - "C++ 23 (gcc 12.2)" => Ok(5028), - "Common Lisp (SBCL 2.3.6)" => Ok(5029), - "COBOL (Free) (GnuCOBOL 3.1.2)" => Ok(5030), - "C++ 23 (Clang 16.0.5)" => Ok(5031), - "Zsh (Zsh 5.9)" => Ok(5032), - "SageMath (SageMath 9.5)" => Ok(5033), - "Sed (GNU sed 4.8)" => Ok(5034), - "bc (bc 1.07.1)" => Ok(5035), - "dc (dc 1.07.1)" => Ok(5036), - "Perl (perl 5.34)" => Ok(5037), - "AWK (GNU Awk 5.0.1)" => Ok(5038), - "なでしこ (cnako3 3.4.20)" => Ok(5039), - "Assembly x64 (NASM 2.15.05)" => Ok(5040), - "Pascal (fpc 3.2.2)" => Ok(5041), - "C# 11.0 AOT (.NET 7.0.7)" => Ok(5042), - "Lua (Lua 5.4.6)" => Ok(5043), - "Prolog (SWI-Prolog 9.0.4)" => Ok(5044), - "PowerShell (PowerShell 7.3.1)" => Ok(5045), - "Scheme (Gauche 0.9.12)" => Ok(5046), - "Scala 3.3.0 (Scala Native 0.4.14)" => Ok(5047), - "Visual Basic 16.9 (.NET 7.0.7)" => Ok(5048), - "Forth (gforth 0.7.3)" => Ok(5049), - "Clojure (babashka 1.3.181)" => Ok(5050), - "Erlang (Erlang 26.0.2)" => Ok(5051), - "TypeScript 5.1 (Deno 1.35.1)" => Ok(5052), - "C++ 17 (gcc 12.2)" => Ok(5053), - "Rust (rustc 1.70.0)" => Ok(5054), - "Python (CPython 3.11.4)" => Ok(5055), - "Scala (Dotty 3.3.0)" => Ok(5056), - "Koka (koka 2.4.0)" => Ok(5057), - "TypeScript 5.1 (Node.js 18.16.1)" => Ok(5058), - "OCaml (ocamlopt 5.0.0)" => Ok(5059), - "Raku (Rakudo 2023.06)" => Ok(5060), - "Vim (vim 9.0.0242)" => Ok(5061), - "Emacs Lisp (Native Compile) (GNU Emacs 28.2)" => Ok(5062), - "Python (Mambaforge / CPython 3.10.10)" => Ok(5063), - "Clojure (clojure 1.11.1)" => Ok(5064), - "プロデル (mono版プロデル 1.9.1182)" => Ok(5065), - "ECLiPSe (ECLiPSe 7.1_13)" => Ok(5066), - "Nibbles (literate form) (nibbles 1.01)" => Ok(5067), - "Ada (GNAT 12.2)" => Ok(5068), - "jq (jq 1.6)" => Ok(5069), - "Cyber (Cyber v0.2-Latest)" => Ok(5070), - "Carp (Carp 0.5.5)" => Ok(5071), - "C++ 17 (Clang 16.0.5)" => Ok(5072), - "C++ 20 (Clang 16.0.5)" => Ok(5073), - "LLVM IR (Clang 16.0.5)" => Ok(5074), - "Emacs Lisp (Byte Compile) (GNU Emacs 28.2)" => Ok(5075), - "Factor (Factor 0.98)" => Ok(5076), - "D (GDC 12.2)" => Ok(5077), - "Python (PyPy 3.10-v7.3.12)" => Ok(5078), - "Whitespace (whitespacers 1.0.0)" => Ok(5079), - "><> (fishr 0.1.0)" => Ok(5080), - "ReasonML (reason 3.9.0)" => Ok(5081), - "Python (Cython 0.29.34)" => Ok(5082), - "Octave (GNU Octave 8.2.0)" => Ok(5083), - "Haxe (JVM) (Haxe 4.3.1)" => Ok(5084), - "Elixir (Elixir 1.15.2)" => Ok(5085), - "Mercury (Mercury 22.01.6)" => Ok(5086), - "Seed7 (Seed7 3.2.1)" => Ok(5087), - "Emacs Lisp (No Compile) (GNU Emacs 28.2)" => Ok(5088), - "Unison (Unison M5b)" => Ok(5089), - "COBOL (GnuCOBOL(Fixed) 3.1.2)" => Ok(5090), + "><> (fishr 0.1.0)" => Ok(6001), + "Ada 2022 (GNAT 15.2.0)" => Ok(6002), + "APL (GNU APL 1.9)" => Ok(6003), + "Assembly MIPS O32 ABI (GNU assembler 2.42)" => Ok(6004), + "Assembly x64 (NASM 2.16.03)" => Ok(6005), + "AWK (GNU awk 5.2.1)" => Ok(6006), + "A言語 (interpreter af48a2a)" => Ok(6007), + "Bash (bash 5.3)" => Ok(6008), + "BASIC (FreeBASIC 1.10.1)" => Ok(6009), + "bc (GNU bc 1.08.2)" => Ok(6010), + "Befunge93 (TBC 1.0)" => Ok(6011), + "Brainfuck (Tritium 1.2.73)" => Ok(6012), + "C23 (Clang 21.1.0)" => Ok(6013), + "C23 (GCC 14.2.0)" => Ok(6014), + "C# 13.0 (.NET 9.0.8)" => Ok(6015), + "C# 13.0 (.NET Native AOT 9.0.8)" => Ok(6016), + "C++23 (GCC 15.2.0)" => Ok(6017), + "C3 (c3c 0.7.5)" => Ok(6018), + "Carp(Carp 0.5.5)" => Ok(6019), + "cLay (cLay 20250308-1 (GCC 15.2.0))" => Ok(6020), + "Clojure (babashka 1.12.208)" => Ok(6021), + "Clojure (clojure 1.12.2)" => Ok(6022), + "Clojure (Clojure AOT 1.12.2)" => Ok(6023), + "Clojure (ClojureScript 1.12.42 (Clojure 1.12.2 Node.js 22.19.0))" => Ok(6025), + "COBOL (Free) (GnuCOBOL 3.2)" => Ok(6026), + "Common Lisp (SBCL 2.5.8)" => Ok(6027), + "Crystal (Crystal 1.17.0)" => Ok(6028), + "Cyber (Cyber v0.3)" => Ok(6029), + "D (DMD 2.111.0)" => Ok(6030), + "D (GDC 15.2)" => Ok(6031), + "D (LDC 1.41.0)" => Ok(6032), + "Dart (Dart 3.9.2)" => Ok(6033), + "dc 1.5.2 (GNU bc 1.08.2)" => Ok(6034), + "ECLiPSe (ECLiPSe 7.1_13)" => Ok(6035), + "Eiffel (Gobo Eiffel 22.01)" => Ok(6036), + "Eiffel (Liberty Eiffel 07829e3)" => Ok(6037), + "Elixir (Elixir 1.18.4 (OTP 28.0.2))" => Ok(6038), + "Emacs Lisp(Native Compile)(GNU Emacs 29.4)" => Ok(6039), + "Emojicode 1.0 beta 2 (emojicodec 1.0 beta 2)" => Ok(6040), + "Erlang (Erlang 28.0.2)" => Ok(6041), + "F# 9.0 (.NET 9.0.8)" => Ok(6042), + "Factor (Factor 0.100)" => Ok(6043), + "Fish (fish 4.0.2)" => Ok(6044), + "Forth (gforth 0.7.3)" => Ok(6045), + "Fortran2018 (Flang 20.1.7)" => Ok(6046), + "Fortran2023 (GCC 14.2.0)" => Ok(6047), + "FORTRAN77 (GCC 14.2.0)" => Ok(6048), + "Gleam (Gleam 1.12.0 (OTP 28.0.2))" => Ok(6049), + "Go 1.18 (gccgo 15.2.0)" => Ok(6050), + "Go (go 1.25.1)" => Ok(6051), + "Haskell (GHC 9.8.4)" => Ok(6052), + "Haxe/JVM 4.3.7 (hxjava 4.2.0)" => Ok(6053), + "C++ IOI-Style(GNU++20) (GCC 14.2.0)" => Ok(6054), + "ISLisp (Easy-ISLisp 5.43)" => Ok(6055), + "Java24 (OpenJDK 24.0.2)" => Ok(6056), + "JavaScript (Bun 1.2.21)" => Ok(6057), + "JavaScript (Deno 2.4.5)" => Ok(6058), + "JavaScript (Node.js 22.19.0)" => Ok(6059), + "Jule (jule 0.1.6)" => Ok(6060), + "Koka (koka v3.2.2)" => Ok(6061), + "Kotlin (Kotlin/JVM 2.2.10)" => Ok(6062), + "Kuin (kuincl v.2021.8.17)" => Ok(6063), + "Lazy K (irori v1.0.0)" => Ok(6064), + "Lean (lean v4.22.0)" => Ok(6065), + "LLVM IR (Clang 21.1.0)" => Ok(6066), + "Lua (Lua 5.4.7)" => Ok(6067), + "Lua (LuaJIT 2.1.1703358377)" => Ok(6068), + "Mercury (Mercury 22.01.8)" => Ok(6069), + "Nim (Nim 1.6.20)" => Ok(6071), + "Nim (Nim 2.2.4)" => Ok(6072), + "OCaml (ocamlopt 5.3.0)" => Ok(6073), + "Octave (GNU Octave 10.2.0)" => Ok(6074), + "Pascal (fpc 3.2.2)" => Ok(6075), + "Perl (perl 5.38.2)" => Ok(6076), + "PHP (PHP 8.4.12)" => Ok(6077), + "Piet (your-diary/piet_programming_language 3.0.0) (PPM image)" => Ok(6078), + "Pony (ponyc 0.59.0)" => Ok(6079), + "PowerShell (PowerShell 7.5.2)" => Ok(6080), + "Prolog (SWI-Prolog 9.2.9)" => Ok(6081), + "Python (CPython 3.13.7)" => Ok(6082), + "Python (PyPy 3.11-v7.3.20)" => Ok(6083), + "R (GNU R 4.5.0)" => Ok(6084), + "ReasonML (reson 3.16.0)" => Ok(6085), + "Ruby 3.3 (truffleruby 25.0.0)" => Ok(6086), + "Ruby 3.4 (ruby 3.4.5)" => Ok(6087), + "Rust (rustc 1.89.0)" => Ok(6088), + "SageMath (SageMath 10.7)" => Ok(6089), + "Scala (Dotty 3.7.2)" => Ok(6090), + "Scala 3.7.2 (Scala Native 0.5.8)" => Ok(6091), + "Scheme (ChezScheme 10.2.0)" => Ok(6092), + "Scheme (Gauche 0.9.15)" => Ok(6093), + "Seed7 (Seed7 3.5.0)" => Ok(6094), + "Swift 6.2" => Ok(6095), + "Tcl (tclsh 9.0.1)" => Ok(6096), + "Terra (Terra 1.2.0)" => Ok(6097), + "TeX (tex 3.141592653)" => Ok(6098), + "Text (cat 9.4)" => Ok(6099), + "TypeScript 5.8 (Deno 2.4.5)" => Ok(6100), + "TypeScript 5.9 (tsc 5.9.2 (Bun 1.2.21))" => Ok(6101), + "TypeScript 5.9 (tsc 5.9.2 (Node.js 22.19.0))" => Ok(6102), + "Uiua (uiua 0.16.2)" => Ok(6103), + "Unison (Unison 0.5.47)" => Ok(6104), + "V (0.4.10)" => Ok(6105), + "Vala (valac 0.56.18)" => Ok(6106), + "Verilog 2012 (Icarus Verilog 12.0)" => Ok(6107), + "Veryl (veryl 0.16.4)" => Ok(6108), + "WebAssembly (wabt 1.0.34 + iwasm 2.4.1)" => Ok(6109), + "Whitespace (whitespacers 1.3.0)" => Ok(6110), + "Zig (Zig 0.15.1)" => Ok(6111), + "なでしこ (cnako3 3.7.8 (Node.js 22.19.0))" => Ok(6112), + "プロデル (mono版プロデル 2.0.1353)" => Ok(6113), + "Julia (Julia 1.11.6)" => Ok(6114), + "Python (Codon 0.19.3)" => Ok(6115), + "C++23 (Clang 21.1.0)" => Ok(6116), + "Fix (1.1.0-alpha.12)" => Ok(6117), + "SQL (DuckDB 1.3.2)" => Ok(6118), _ => Err(anyhow!("Unknown language name error.")), } } @@ -102,8 +128,8 @@ mod test { #[test] fn test_lang_to_id() { - assert_eq!(5001, lang_to_id("C++ 20 (gcc 12.2)").unwrap()); - assert_eq!(5002, lang_to_id("Go (go 1.20.6)").unwrap()); + assert_eq!(6001, lang_to_id("><> (fishr 0.1.0)").unwrap()); + assert_eq!(6118, lang_to_id("SQL (DuckDB 1.3.2)").unwrap()); assert!(lang_to_id("Vim").is_err()); } }