├── .gitignore ├── README.md ├── Cargo.toml ├── prompts └── judge.md ├── data └── code-to-judge ├── src └── main.rs └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | .envrc 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # code-judger 2 | 3 | Usage: 4 | 5 | ```bash 6 | export ANTHROPIC_API_KEY="..." 7 | cargo run -- --provider=anthropic 8 | 9 | export OPENAI_API_KEY="..." 10 | cargo run -- --provider=openai 11 | ``` 12 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "code-judger" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | ureq = { version = "2.9", features = ["json"] } 10 | serde_json = "1.0" 11 | serde = { version = "1.0", features = ["derive"] } 12 | anyhow = "1.0" 13 | clap = { version = "4.4", features = ["derive"] } 14 | regex = "1.10" 15 | -------------------------------------------------------------------------------- /prompts/judge.md: -------------------------------------------------------------------------------- 1 | ## Task 2 | 3 | You are an expert code judger. Evaluate the code against the constraints and provide: 4 | 5 | 1. Brief code analysis 6 | 2. Constraints met 7 | 3. Constraints not met 8 | 4. Final score (1-3) 9 | 10 | ### Scoring: 11 | - **3 (Perfect)**: All must-have [MUST] constraints met + all nice-to-have constraints met (if any). 12 | - **2 (Acceptable)**: All must-have constraints met, but some nice-to-have constraints are missing. 13 | - **1 (Failed)**: At least one must-have constraint is missing or the code is invalid. 14 | 15 | ### Code: 16 | 17 | 18 | ### Constraints: 19 | 20 | 21 | ### Final Output Requirements: 22 | - Put the score on its own line at the very end 23 | - The score must be the only content on that line 24 | - Only use whole numbers between 1 and 3 25 | 26 | Example of valid output: 27 | The code meets all must-have constraints but misses some nice-to-haves. 28 | 2 29 | 30 | Example of INVALID output: 31 | Score: 2/3 32 | Final rating: 2.5 33 | -------------------------------------------------------------------------------- /data/code-to-judge: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Thorsten Ball - About me 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 |
18 | 47 | 48 |
49 | Thorsten Ball's profile picture 50 |

51 | Hello! I'm Thorsten. 52 |

53 | 54 |

55 | I work remotely as a software engineer for Zed. Before that I spent nearly 5 years at Sourcegraph. 56 |

57 | 58 |

59 | I wrote and self-published two books you might have heard of. 60 |

61 | 62 |

63 |

You can also find me on Twitter, Bluesky, Mastodon, GitHub, and LinkedIn.

64 |

65 | 66 |
67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 |

Contact

97 |
98 |

Never hesitate to send me an email at me@thorstenball.com. I love getting email from you.

99 |
100 | 101 |

Newsletter

102 | 105 | 106 |
107 | 108 |
109 | 110 |
111 |

112 | Copyright © 2025 Thorsten Ball. All rights 113 | reserved. 114 |

115 |
116 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::ops::RangeInclusive; 2 | 3 | use anyhow::{Context, Result}; 4 | use clap::Parser; 5 | use serde::{Deserialize, Serialize}; 6 | use serde_json::json; 7 | 8 | #[derive(Parser, Debug)] 9 | #[command(author, version, about, long_about = None)] 10 | struct Args { 11 | #[arg(long, default_value = "anthropic")] 12 | provider: String, 13 | } 14 | 15 | #[derive(Debug, Serialize, Deserialize)] 16 | struct ContentItem { 17 | text: String, 18 | #[serde(rename = "type")] 19 | content_type: String, 20 | } 21 | 22 | #[derive(Debug, Serialize, Deserialize)] 23 | struct ClaudeResponse { 24 | content: Vec, 25 | } 26 | 27 | #[derive(Debug, Serialize, Deserialize)] 28 | struct OpenAIResponse { 29 | choices: Vec, 30 | } 31 | 32 | #[derive(Debug, Serialize, Deserialize)] 33 | struct OpenAIChoice { 34 | message: OpenAIMessage, 35 | } 36 | 37 | #[derive(Debug, Serialize, Deserialize)] 38 | struct OpenAIMessage { 39 | content: String, 40 | } 41 | 42 | struct Judgement { 43 | score: i32, 44 | message: String, 45 | } 46 | 47 | fn get_claude_response(prompt: &str) -> Result { 48 | let api_key = std::env::var("ANTHROPIC_API_KEY").expect("ANTHROPIC_API_KEY is not set"); 49 | let model = "claude-3-5-sonnet-latest"; 50 | 51 | let response = ureq::post("https://api.anthropic.com/v1/messages") 52 | .set("x-api-key", &api_key) 53 | .set("anthropic-version", "2023-06-01") 54 | .set("content-type", "application/json") 55 | .send_json(json!({ 56 | "model": model, 57 | "temperature": 0.0, 58 | "max_tokens": 1024, 59 | "messages": [{ 60 | "role": "user", 61 | "content": prompt 62 | }], 63 | })); 64 | 65 | let response = match response { 66 | Ok(res) => res, 67 | Err(ureq::Error::Status(status, res)) => { 68 | let error_body = res 69 | .into_string() 70 | .context("Failed to read error response body")?; 71 | return Err(anyhow::anyhow!("API error {}: {}", status, error_body)); 72 | } 73 | Err(e) => return Err(e.into()), 74 | }; 75 | 76 | let mut response_body: ClaudeResponse = response.into_json()?; 77 | Ok(response_body.content.remove(0).text) 78 | } 79 | 80 | fn get_openai_response(prompt: &str) -> Result { 81 | let api_key = std::env::var("OPENAI_API_KEY").expect("OPENAI_API_KEY is not set"); 82 | let model = "gpt-4o"; 83 | 84 | let response = ureq::post("https://api.openai.com/v1/chat/completions") 85 | .set("Authorization", &format!("Bearer {}", api_key)) 86 | .set("content-type", "application/json") 87 | .send_json(json!({ 88 | "model": model, 89 | "temperature": 0.0, 90 | "messages": [{ 91 | "role": "user", 92 | "content": prompt 93 | }] 94 | })); 95 | 96 | let response = match response { 97 | Ok(res) => res, 98 | Err(ureq::Error::Status(status, res)) => { 99 | let error_body = res 100 | .into_string() 101 | .context("Failed to read error response body")?; 102 | return Err(anyhow::anyhow!("API error {}: {}", status, error_body)); 103 | } 104 | Err(e) => return Err(e.into()), 105 | }; 106 | 107 | let response_body: OpenAIResponse = response.into_json()?; 108 | Ok(response_body.choices[0].message.content.clone()) 109 | } 110 | 111 | fn get_llm_response(provider: &str, prompt: &str) -> Result { 112 | match provider { 113 | "anthropic" => get_claude_response(prompt), 114 | "openai" => get_openai_response(prompt), 115 | _ => Err(anyhow::anyhow!("Unsupported provider: {}", provider)), 116 | } 117 | } 118 | 119 | fn judge_code(provider: &str, code: &str, assertions: &[&str]) -> Result { 120 | let mut fenced_code = String::from("```"); 121 | fenced_code.push_str(code); 122 | fenced_code.push_str("```"); 123 | 124 | let formatted_assertions = assertions 125 | .iter() 126 | .map(|a| format!("- {}", a)) 127 | .collect::>() 128 | .join("\n"); 129 | 130 | let prompt = include_str!("../prompts/judge.md") 131 | .replace("", &fenced_code) 132 | .replace("", &formatted_assertions); 133 | 134 | let response = get_llm_response(provider, &prompt)?; 135 | 136 | let score = 137 | parse_score(&response).with_context(|| format!("Failed to parse score from response"))?; 138 | 139 | Ok(Judgement { 140 | score, 141 | message: response, 142 | }) 143 | } 144 | 145 | const VALID_SCORE_RANGE: RangeInclusive = 1..=3; 146 | 147 | fn parse_score(response: &str) -> Result { 148 | response 149 | .lines() 150 | .last() 151 | .map(|s| s.trim()) 152 | .and_then(|s| s.parse().ok()) 153 | .ok_or_else(|| anyhow::anyhow!("Failed to parse score from response:\n{}", response)) 154 | .and_then(|score: i32| { 155 | if VALID_SCORE_RANGE.contains(&score) { 156 | Ok(score) 157 | } else { 158 | Err(anyhow::anyhow!("Score {} out of valid range 1-3", score)) 159 | } 160 | }) 161 | } 162 | 163 | const RED: &'static str = "\x1b[31m"; 164 | const GREEN: &'static str = "\x1b[32m"; 165 | const RESET: &'static str = "\x1b[0m"; 166 | 167 | struct TestCase { 168 | assertions: Vec<&'static str>, 169 | expected_score: RangeInclusive, 170 | } 171 | 172 | fn main() -> Result<()> { 173 | let args = Args::parse(); 174 | 175 | let code = include_str!("../data/code-to-judge"); 176 | 177 | let test_cases = vec![ 178 | TestCase { 179 | assertions: vec![ 180 | "[MUST] The year of the copyright notice has to be 2025.", 181 | "[MUST] The link to the Twitter profile has to be to @thorstenball (ignore the lack of protocol)", 182 | "Menu item linking to Register Spill must be marked as new", 183 | "Should mention that Thorsten is happy to receive emails", 184 | "Has photo of Thorsten", 185 | ], 186 | expected_score: 2..=3, 187 | }, 188 | TestCase { 189 | assertions: vec![ 190 | "[MUST] The year of the copyright notice has to be 2025.", 191 | "[MUST] The link to the Twitter profile has to be to @thorstenball", 192 | "Menu item linking to Register Spill must be marked as new", 193 | "[MUST] Must mention that Thorsten is happy to phone calls", 194 | "Has photo of Thorsten", 195 | ], 196 | expected_score: 1..=1, 197 | }, 198 | ]; 199 | 200 | for test_case in test_cases.iter() { 201 | let result = judge_code(&args.provider, code, &test_case.assertions)?; 202 | println!( 203 | "========= Result =======\nMessage: {}\n\nScore: {}{}{}\n", 204 | result.message, 205 | if result.score < 2 { RED } else { GREEN }, 206 | result.score, 207 | RESET 208 | ); 209 | 210 | assert!( 211 | test_case.expected_score.contains(&result.score), 212 | "Score {:?} out of expected range {:?}", 213 | result.score, 214 | test_case.expected_score 215 | ); 216 | } 217 | 218 | Ok(()) 219 | } 220 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "adler2" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "1.1.3" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "anstream" 22 | version = "0.6.18" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" 25 | dependencies = [ 26 | "anstyle", 27 | "anstyle-parse", 28 | "anstyle-query", 29 | "anstyle-wincon", 30 | "colorchoice", 31 | "is_terminal_polyfill", 32 | "utf8parse", 33 | ] 34 | 35 | [[package]] 36 | name = "anstyle" 37 | version = "1.0.10" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" 40 | 41 | [[package]] 42 | name = "anstyle-parse" 43 | version = "0.2.6" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" 46 | dependencies = [ 47 | "utf8parse", 48 | ] 49 | 50 | [[package]] 51 | name = "anstyle-query" 52 | version = "1.1.2" 53 | source = "registry+https://github.com/rust-lang/crates.io-index" 54 | checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" 55 | dependencies = [ 56 | "windows-sys 0.59.0", 57 | ] 58 | 59 | [[package]] 60 | name = "anstyle-wincon" 61 | version = "3.0.7" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" 64 | dependencies = [ 65 | "anstyle", 66 | "once_cell", 67 | "windows-sys 0.59.0", 68 | ] 69 | 70 | [[package]] 71 | name = "anyhow" 72 | version = "1.0.95" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" 75 | 76 | [[package]] 77 | name = "base64" 78 | version = "0.22.1" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 81 | 82 | [[package]] 83 | name = "cc" 84 | version = "1.2.9" 85 | source = "registry+https://github.com/rust-lang/crates.io-index" 86 | checksum = "c8293772165d9345bdaaa39b45b2109591e63fe5e6fbc23c6ff930a048aa310b" 87 | dependencies = [ 88 | "shlex", 89 | ] 90 | 91 | [[package]] 92 | name = "cfg-if" 93 | version = "1.0.0" 94 | source = "registry+https://github.com/rust-lang/crates.io-index" 95 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 96 | 97 | [[package]] 98 | name = "clap" 99 | version = "4.5.27" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" 102 | dependencies = [ 103 | "clap_builder", 104 | "clap_derive", 105 | ] 106 | 107 | [[package]] 108 | name = "clap_builder" 109 | version = "4.5.27" 110 | source = "registry+https://github.com/rust-lang/crates.io-index" 111 | checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" 112 | dependencies = [ 113 | "anstream", 114 | "anstyle", 115 | "clap_lex", 116 | "strsim", 117 | ] 118 | 119 | [[package]] 120 | name = "clap_derive" 121 | version = "4.5.24" 122 | source = "registry+https://github.com/rust-lang/crates.io-index" 123 | checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" 124 | dependencies = [ 125 | "heck", 126 | "proc-macro2", 127 | "quote", 128 | "syn", 129 | ] 130 | 131 | [[package]] 132 | name = "clap_lex" 133 | version = "0.7.4" 134 | source = "registry+https://github.com/rust-lang/crates.io-index" 135 | checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" 136 | 137 | [[package]] 138 | name = "code-judger" 139 | version = "0.1.0" 140 | dependencies = [ 141 | "anyhow", 142 | "clap", 143 | "regex", 144 | "serde", 145 | "serde_json", 146 | "ureq", 147 | ] 148 | 149 | [[package]] 150 | name = "colorchoice" 151 | version = "1.0.3" 152 | source = "registry+https://github.com/rust-lang/crates.io-index" 153 | checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" 154 | 155 | [[package]] 156 | name = "crc32fast" 157 | version = "1.4.2" 158 | source = "registry+https://github.com/rust-lang/crates.io-index" 159 | checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" 160 | dependencies = [ 161 | "cfg-if", 162 | ] 163 | 164 | [[package]] 165 | name = "displaydoc" 166 | version = "0.2.5" 167 | source = "registry+https://github.com/rust-lang/crates.io-index" 168 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 169 | dependencies = [ 170 | "proc-macro2", 171 | "quote", 172 | "syn", 173 | ] 174 | 175 | [[package]] 176 | name = "flate2" 177 | version = "1.0.35" 178 | source = "registry+https://github.com/rust-lang/crates.io-index" 179 | checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" 180 | dependencies = [ 181 | "crc32fast", 182 | "miniz_oxide", 183 | ] 184 | 185 | [[package]] 186 | name = "form_urlencoded" 187 | version = "1.2.1" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 190 | dependencies = [ 191 | "percent-encoding", 192 | ] 193 | 194 | [[package]] 195 | name = "getrandom" 196 | version = "0.2.15" 197 | source = "registry+https://github.com/rust-lang/crates.io-index" 198 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 199 | dependencies = [ 200 | "cfg-if", 201 | "libc", 202 | "wasi", 203 | ] 204 | 205 | [[package]] 206 | name = "heck" 207 | version = "0.5.0" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 210 | 211 | [[package]] 212 | name = "icu_collections" 213 | version = "1.5.0" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 216 | dependencies = [ 217 | "displaydoc", 218 | "yoke", 219 | "zerofrom", 220 | "zerovec", 221 | ] 222 | 223 | [[package]] 224 | name = "icu_locid" 225 | version = "1.5.0" 226 | source = "registry+https://github.com/rust-lang/crates.io-index" 227 | checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 228 | dependencies = [ 229 | "displaydoc", 230 | "litemap", 231 | "tinystr", 232 | "writeable", 233 | "zerovec", 234 | ] 235 | 236 | [[package]] 237 | name = "icu_locid_transform" 238 | version = "1.5.0" 239 | source = "registry+https://github.com/rust-lang/crates.io-index" 240 | checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 241 | dependencies = [ 242 | "displaydoc", 243 | "icu_locid", 244 | "icu_locid_transform_data", 245 | "icu_provider", 246 | "tinystr", 247 | "zerovec", 248 | ] 249 | 250 | [[package]] 251 | name = "icu_locid_transform_data" 252 | version = "1.5.0" 253 | source = "registry+https://github.com/rust-lang/crates.io-index" 254 | checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" 255 | 256 | [[package]] 257 | name = "icu_normalizer" 258 | version = "1.5.0" 259 | source = "registry+https://github.com/rust-lang/crates.io-index" 260 | checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 261 | dependencies = [ 262 | "displaydoc", 263 | "icu_collections", 264 | "icu_normalizer_data", 265 | "icu_properties", 266 | "icu_provider", 267 | "smallvec", 268 | "utf16_iter", 269 | "utf8_iter", 270 | "write16", 271 | "zerovec", 272 | ] 273 | 274 | [[package]] 275 | name = "icu_normalizer_data" 276 | version = "1.5.0" 277 | source = "registry+https://github.com/rust-lang/crates.io-index" 278 | checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" 279 | 280 | [[package]] 281 | name = "icu_properties" 282 | version = "1.5.1" 283 | source = "registry+https://github.com/rust-lang/crates.io-index" 284 | checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 285 | dependencies = [ 286 | "displaydoc", 287 | "icu_collections", 288 | "icu_locid_transform", 289 | "icu_properties_data", 290 | "icu_provider", 291 | "tinystr", 292 | "zerovec", 293 | ] 294 | 295 | [[package]] 296 | name = "icu_properties_data" 297 | version = "1.5.0" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" 300 | 301 | [[package]] 302 | name = "icu_provider" 303 | version = "1.5.0" 304 | source = "registry+https://github.com/rust-lang/crates.io-index" 305 | checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 306 | dependencies = [ 307 | "displaydoc", 308 | "icu_locid", 309 | "icu_provider_macros", 310 | "stable_deref_trait", 311 | "tinystr", 312 | "writeable", 313 | "yoke", 314 | "zerofrom", 315 | "zerovec", 316 | ] 317 | 318 | [[package]] 319 | name = "icu_provider_macros" 320 | version = "1.5.0" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 323 | dependencies = [ 324 | "proc-macro2", 325 | "quote", 326 | "syn", 327 | ] 328 | 329 | [[package]] 330 | name = "idna" 331 | version = "1.0.3" 332 | source = "registry+https://github.com/rust-lang/crates.io-index" 333 | checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 334 | dependencies = [ 335 | "idna_adapter", 336 | "smallvec", 337 | "utf8_iter", 338 | ] 339 | 340 | [[package]] 341 | name = "idna_adapter" 342 | version = "1.2.0" 343 | source = "registry+https://github.com/rust-lang/crates.io-index" 344 | checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 345 | dependencies = [ 346 | "icu_normalizer", 347 | "icu_properties", 348 | ] 349 | 350 | [[package]] 351 | name = "is_terminal_polyfill" 352 | version = "1.70.1" 353 | source = "registry+https://github.com/rust-lang/crates.io-index" 354 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 355 | 356 | [[package]] 357 | name = "itoa" 358 | version = "1.0.14" 359 | source = "registry+https://github.com/rust-lang/crates.io-index" 360 | checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" 361 | 362 | [[package]] 363 | name = "libc" 364 | version = "0.2.169" 365 | source = "registry+https://github.com/rust-lang/crates.io-index" 366 | checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a" 367 | 368 | [[package]] 369 | name = "litemap" 370 | version = "0.7.4" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" 373 | 374 | [[package]] 375 | name = "log" 376 | version = "0.4.22" 377 | source = "registry+https://github.com/rust-lang/crates.io-index" 378 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 379 | 380 | [[package]] 381 | name = "memchr" 382 | version = "2.7.4" 383 | source = "registry+https://github.com/rust-lang/crates.io-index" 384 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 385 | 386 | [[package]] 387 | name = "miniz_oxide" 388 | version = "0.8.2" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "4ffbe83022cedc1d264172192511ae958937694cd57ce297164951b8b3568394" 391 | dependencies = [ 392 | "adler2", 393 | ] 394 | 395 | [[package]] 396 | name = "once_cell" 397 | version = "1.20.2" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 400 | 401 | [[package]] 402 | name = "percent-encoding" 403 | version = "2.3.1" 404 | source = "registry+https://github.com/rust-lang/crates.io-index" 405 | checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 406 | 407 | [[package]] 408 | name = "proc-macro2" 409 | version = "1.0.93" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99" 412 | dependencies = [ 413 | "unicode-ident", 414 | ] 415 | 416 | [[package]] 417 | name = "quote" 418 | version = "1.0.38" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" 421 | dependencies = [ 422 | "proc-macro2", 423 | ] 424 | 425 | [[package]] 426 | name = "regex" 427 | version = "1.11.1" 428 | source = "registry+https://github.com/rust-lang/crates.io-index" 429 | checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" 430 | dependencies = [ 431 | "aho-corasick", 432 | "memchr", 433 | "regex-automata", 434 | "regex-syntax", 435 | ] 436 | 437 | [[package]] 438 | name = "regex-automata" 439 | version = "0.4.9" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" 442 | dependencies = [ 443 | "aho-corasick", 444 | "memchr", 445 | "regex-syntax", 446 | ] 447 | 448 | [[package]] 449 | name = "regex-syntax" 450 | version = "0.8.5" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 453 | 454 | [[package]] 455 | name = "ring" 456 | version = "0.17.8" 457 | source = "registry+https://github.com/rust-lang/crates.io-index" 458 | checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" 459 | dependencies = [ 460 | "cc", 461 | "cfg-if", 462 | "getrandom", 463 | "libc", 464 | "spin", 465 | "untrusted", 466 | "windows-sys 0.52.0", 467 | ] 468 | 469 | [[package]] 470 | name = "rustls" 471 | version = "0.23.21" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "8f287924602bf649d949c63dc8ac8b235fa5387d394020705b80c4eb597ce5b8" 474 | dependencies = [ 475 | "log", 476 | "once_cell", 477 | "ring", 478 | "rustls-pki-types", 479 | "rustls-webpki", 480 | "subtle", 481 | "zeroize", 482 | ] 483 | 484 | [[package]] 485 | name = "rustls-pki-types" 486 | version = "1.10.1" 487 | source = "registry+https://github.com/rust-lang/crates.io-index" 488 | checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" 489 | 490 | [[package]] 491 | name = "rustls-webpki" 492 | version = "0.102.8" 493 | source = "registry+https://github.com/rust-lang/crates.io-index" 494 | checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" 495 | dependencies = [ 496 | "ring", 497 | "rustls-pki-types", 498 | "untrusted", 499 | ] 500 | 501 | [[package]] 502 | name = "ryu" 503 | version = "1.0.18" 504 | source = "registry+https://github.com/rust-lang/crates.io-index" 505 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 506 | 507 | [[package]] 508 | name = "serde" 509 | version = "1.0.217" 510 | source = "registry+https://github.com/rust-lang/crates.io-index" 511 | checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" 512 | dependencies = [ 513 | "serde_derive", 514 | ] 515 | 516 | [[package]] 517 | name = "serde_derive" 518 | version = "1.0.217" 519 | source = "registry+https://github.com/rust-lang/crates.io-index" 520 | checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" 521 | dependencies = [ 522 | "proc-macro2", 523 | "quote", 524 | "syn", 525 | ] 526 | 527 | [[package]] 528 | name = "serde_json" 529 | version = "1.0.135" 530 | source = "registry+https://github.com/rust-lang/crates.io-index" 531 | checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" 532 | dependencies = [ 533 | "itoa", 534 | "memchr", 535 | "ryu", 536 | "serde", 537 | ] 538 | 539 | [[package]] 540 | name = "shlex" 541 | version = "1.3.0" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 544 | 545 | [[package]] 546 | name = "smallvec" 547 | version = "1.13.2" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 550 | 551 | [[package]] 552 | name = "spin" 553 | version = "0.9.8" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 556 | 557 | [[package]] 558 | name = "stable_deref_trait" 559 | version = "1.2.0" 560 | source = "registry+https://github.com/rust-lang/crates.io-index" 561 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 562 | 563 | [[package]] 564 | name = "strsim" 565 | version = "0.11.1" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 568 | 569 | [[package]] 570 | name = "subtle" 571 | version = "2.6.1" 572 | source = "registry+https://github.com/rust-lang/crates.io-index" 573 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 574 | 575 | [[package]] 576 | name = "syn" 577 | version = "2.0.96" 578 | source = "registry+https://github.com/rust-lang/crates.io-index" 579 | checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80" 580 | dependencies = [ 581 | "proc-macro2", 582 | "quote", 583 | "unicode-ident", 584 | ] 585 | 586 | [[package]] 587 | name = "synstructure" 588 | version = "0.13.1" 589 | source = "registry+https://github.com/rust-lang/crates.io-index" 590 | checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 591 | dependencies = [ 592 | "proc-macro2", 593 | "quote", 594 | "syn", 595 | ] 596 | 597 | [[package]] 598 | name = "tinystr" 599 | version = "0.7.6" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 602 | dependencies = [ 603 | "displaydoc", 604 | "zerovec", 605 | ] 606 | 607 | [[package]] 608 | name = "unicode-ident" 609 | version = "1.0.14" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" 612 | 613 | [[package]] 614 | name = "untrusted" 615 | version = "0.9.0" 616 | source = "registry+https://github.com/rust-lang/crates.io-index" 617 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 618 | 619 | [[package]] 620 | name = "ureq" 621 | version = "2.12.1" 622 | source = "registry+https://github.com/rust-lang/crates.io-index" 623 | checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" 624 | dependencies = [ 625 | "base64", 626 | "flate2", 627 | "log", 628 | "once_cell", 629 | "rustls", 630 | "rustls-pki-types", 631 | "serde", 632 | "serde_json", 633 | "url", 634 | "webpki-roots", 635 | ] 636 | 637 | [[package]] 638 | name = "url" 639 | version = "2.5.4" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 642 | dependencies = [ 643 | "form_urlencoded", 644 | "idna", 645 | "percent-encoding", 646 | ] 647 | 648 | [[package]] 649 | name = "utf16_iter" 650 | version = "1.0.5" 651 | source = "registry+https://github.com/rust-lang/crates.io-index" 652 | checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 653 | 654 | [[package]] 655 | name = "utf8_iter" 656 | version = "1.0.4" 657 | source = "registry+https://github.com/rust-lang/crates.io-index" 658 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 659 | 660 | [[package]] 661 | name = "utf8parse" 662 | version = "0.2.2" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 665 | 666 | [[package]] 667 | name = "wasi" 668 | version = "0.11.0+wasi-snapshot-preview1" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 671 | 672 | [[package]] 673 | name = "webpki-roots" 674 | version = "0.26.7" 675 | source = "registry+https://github.com/rust-lang/crates.io-index" 676 | checksum = "5d642ff16b7e79272ae451b7322067cdc17cadf68c23264be9d94a32319efe7e" 677 | dependencies = [ 678 | "rustls-pki-types", 679 | ] 680 | 681 | [[package]] 682 | name = "windows-sys" 683 | version = "0.52.0" 684 | source = "registry+https://github.com/rust-lang/crates.io-index" 685 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 686 | dependencies = [ 687 | "windows-targets", 688 | ] 689 | 690 | [[package]] 691 | name = "windows-sys" 692 | version = "0.59.0" 693 | source = "registry+https://github.com/rust-lang/crates.io-index" 694 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 695 | dependencies = [ 696 | "windows-targets", 697 | ] 698 | 699 | [[package]] 700 | name = "windows-targets" 701 | version = "0.52.6" 702 | source = "registry+https://github.com/rust-lang/crates.io-index" 703 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 704 | dependencies = [ 705 | "windows_aarch64_gnullvm", 706 | "windows_aarch64_msvc", 707 | "windows_i686_gnu", 708 | "windows_i686_gnullvm", 709 | "windows_i686_msvc", 710 | "windows_x86_64_gnu", 711 | "windows_x86_64_gnullvm", 712 | "windows_x86_64_msvc", 713 | ] 714 | 715 | [[package]] 716 | name = "windows_aarch64_gnullvm" 717 | version = "0.52.6" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 720 | 721 | [[package]] 722 | name = "windows_aarch64_msvc" 723 | version = "0.52.6" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 726 | 727 | [[package]] 728 | name = "windows_i686_gnu" 729 | version = "0.52.6" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 732 | 733 | [[package]] 734 | name = "windows_i686_gnullvm" 735 | version = "0.52.6" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 738 | 739 | [[package]] 740 | name = "windows_i686_msvc" 741 | version = "0.52.6" 742 | source = "registry+https://github.com/rust-lang/crates.io-index" 743 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 744 | 745 | [[package]] 746 | name = "windows_x86_64_gnu" 747 | version = "0.52.6" 748 | source = "registry+https://github.com/rust-lang/crates.io-index" 749 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 750 | 751 | [[package]] 752 | name = "windows_x86_64_gnullvm" 753 | version = "0.52.6" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 756 | 757 | [[package]] 758 | name = "windows_x86_64_msvc" 759 | version = "0.52.6" 760 | source = "registry+https://github.com/rust-lang/crates.io-index" 761 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 762 | 763 | [[package]] 764 | name = "write16" 765 | version = "1.0.0" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 768 | 769 | [[package]] 770 | name = "writeable" 771 | version = "0.5.5" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 774 | 775 | [[package]] 776 | name = "yoke" 777 | version = "0.7.5" 778 | source = "registry+https://github.com/rust-lang/crates.io-index" 779 | checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 780 | dependencies = [ 781 | "serde", 782 | "stable_deref_trait", 783 | "yoke-derive", 784 | "zerofrom", 785 | ] 786 | 787 | [[package]] 788 | name = "yoke-derive" 789 | version = "0.7.5" 790 | source = "registry+https://github.com/rust-lang/crates.io-index" 791 | checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 792 | dependencies = [ 793 | "proc-macro2", 794 | "quote", 795 | "syn", 796 | "synstructure", 797 | ] 798 | 799 | [[package]] 800 | name = "zerofrom" 801 | version = "0.1.5" 802 | source = "registry+https://github.com/rust-lang/crates.io-index" 803 | checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" 804 | dependencies = [ 805 | "zerofrom-derive", 806 | ] 807 | 808 | [[package]] 809 | name = "zerofrom-derive" 810 | version = "0.1.5" 811 | source = "registry+https://github.com/rust-lang/crates.io-index" 812 | checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" 813 | dependencies = [ 814 | "proc-macro2", 815 | "quote", 816 | "syn", 817 | "synstructure", 818 | ] 819 | 820 | [[package]] 821 | name = "zeroize" 822 | version = "1.8.1" 823 | source = "registry+https://github.com/rust-lang/crates.io-index" 824 | checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 825 | 826 | [[package]] 827 | name = "zerovec" 828 | version = "0.10.4" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 831 | dependencies = [ 832 | "yoke", 833 | "zerofrom", 834 | "zerovec-derive", 835 | ] 836 | 837 | [[package]] 838 | name = "zerovec-derive" 839 | version = "0.10.3" 840 | source = "registry+https://github.com/rust-lang/crates.io-index" 841 | checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 842 | dependencies = [ 843 | "proc-macro2", 844 | "quote", 845 | "syn", 846 | ] 847 | --------------------------------------------------------------------------------