Skip to content

Commit 13802f7

Browse files
committed
Improve error handling for utils.rs and others
1 parent 3ecbbfd commit 13802f7

File tree

6 files changed

+156
-215
lines changed

6 files changed

+156
-215
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ edition = "2021"
77
clap = { version = "4.2.1", features = ["derive"] }
88
colored = "2.0.0"
99
eyre = "0.6.8"
10-
reqwest ={version = "0.11.16", features=["blocking", "json"]}
11-
serde = {version="1.0.159", features=["derive"]}
10+
reqwest = { version = "0.11.16", features = ["blocking", "json"] }
11+
serde = { version = "1.0.159", features = ["derive"] }
1212
serde_json = "1.0.95"

src/handlers/leetcode/api/execute.rs

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,25 @@
11
use crate::handlers::{leetcode::*, utils::ExecutionResult};
22

3+
use eyre::{bail, Context, Result};
4+
35
impl LeetCode<Authorized> {
4-
pub fn execute_default(&self, codefile: &CodeFile) -> Result<ExecutionResult, &str> {
6+
pub fn execute_default(&self, codefile: &CodeFile) -> Result<ExecutionResult> {
57
self.execute(codefile, String::new())
68
}
7-
pub fn execute(
8-
&self,
9-
codefile: &CodeFile,
10-
mut data_input: String,
11-
) -> Result<ExecutionResult, &str> {
9+
pub fn execute(&self, codefile: &CodeFile, mut data_input: String) -> Result<ExecutionResult> {
1210
let question_title = codefile.question_title.clone();
1311
let ques = self.question_metadata(&question_title)?;
14-
if data_input == "" {
12+
if data_input.is_empty() {
1513
data_input = ques.exampleTestcaseList.join("\n");
14+
1615
// write this to testcase.txt
17-
if let Ok(mut file) = std::fs::File::create("testcase.txt") {
18-
if let Ok(_) = std::io::Write::write_all(&mut file, data_input.as_bytes()) {
19-
println!("Wrote default testcases to testcase.txt");
20-
} else {
21-
eprintln!("Failed to write default testcases to testcase.txt!");
22-
}
23-
} else {
24-
eprintln!("Failed to create testcase.txt!");
25-
}
16+
let mut file = std::fs::File::create("testcase.txt")?;
17+
std::io::Write::write_all(&mut file, data_input.as_bytes())?;
18+
println!("Wrote default testcases to testcase.txt");
2619
}
20+
2721
let question_id = ques.questionId;
22+
2823
self._execute(
2924
codefile.language.to_string(),
3025
question_id,
@@ -41,39 +36,45 @@ impl LeetCode<Authorized> {
4136
question_title: String,
4237
typed_code: String,
4338
data_input: String,
44-
) -> Result<ExecutionResult, &str> {
39+
) -> Result<ExecutionResult> {
4540
let client = &self.client;
4641
let url = format!(
4742
"https://leetcode.com/problems/{}/interpret_solution/",
4843
question_title
4944
);
45+
5046
let testcase = TestCaseExec {
5147
lang,
5248
question_id,
5349
question_title,
5450
typed_code,
5551
data_input,
5652
};
57-
let Ok(data)= client.post(&url).json(&testcase).send() else {
58-
return Err("Failed to parse arguments!");
59-
};
60-
let Ok(data) = data.json::<InterpretID>() else{
61-
return Err("Failed to parse JSON from leetcode! Try again after sometime or renew cookie");
62-
};
53+
54+
let data = client
55+
.post(&url)
56+
.json(&testcase)
57+
.send()?
58+
.json::<InterpretID>()
59+
.wrap_err(
60+
"Failed to parse JSON from LeetCode, Try again after sometime or renew your cookie",
61+
)?;
6362

6463
let interpret_id = data.interpret_id;
64+
6565
println!("Executing testcases...");
6666
let mut last_state = PendingState::Unknown;
6767
loop {
6868
let url = format!("https://leetcode.com/submissions/detail/{interpret_id}/check/");
6969
// std::thread::sleep(std::time::Duration::from_secs(7));
70-
let Ok(data) = client.get(&url).send() else {
71-
return Err("Failed to parse arguments!");
72-
};
70+
let data = client
71+
.get(&url)
72+
.send()?
73+
.json::<ExecutionResult>()
74+
.wrap_err(
75+
"Failed to parse JSON from LeetCode, Try again after sometime or renew your cookie",
76+
)?;
7377

74-
let Ok(data) = data.json::<ExecutionResult>() else {
75-
return Err("Failed to parse JSON from leetcode! Try again after sometime or renew cookie");
76-
};
7778
match data {
7879
ExecutionResult::PendingResult(data) => {
7980
let curr_state = data.state();
@@ -89,22 +90,18 @@ impl LeetCode<Authorized> {
8990
}
9091
}
9192
PendingState::Success => {
92-
println!("Your code was executed successfully but we failed to parse result\nCheck on leetcode manually");
93-
std::process::exit(1);
93+
bail!("our code was executed successfully but we failed to parse result\nCheck on leetcode manually");
9494
}
9595
PendingState::Unknown => {
96-
println!(
96+
bail!(
9797
"Status : {}\nKindly report this state to developer",
9898
data.state.as_str()
9999
);
100-
std::process::exit(1);
101100
}
102101
};
103102
last_state = curr_state;
104-
105-
continue;
106103
}
107-
data => return Ok(data),
104+
not_pending_data => return Ok(not_pending_data),
108105
};
109106
}
110107
}

src/handlers/leetcode/api/question.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -135,17 +135,19 @@ impl LeetCode<Authorized> {
135135
Ok(data.json::<Data>().map(|op| op.data.question)?)
136136
}
137137

138-
pub fn question_metadata(&self, title_slug: &str) -> Result<Question, &str> {
138+
pub fn question_metadata(&self, title_slug: &str) -> Result<Question> {
139139
let client = &self.client;
140140
let url = "https://leetcode.com/graphql";
141141

142142
let query = GraphqlRequest {
143143
query: "\n query consolePanelConfig($titleSlug: String!) {\n question(titleSlug: $titleSlug) {\n questionId\n questionFrontendId\n questionTitle\n enableDebugger\n enableRunCode\n enableSubmit\n enableTestMode\n exampleTestcaseList\n metaData\n }\n}\n".to_string(),
144144
variables: serde_json::to_string(&Variables { titleSlug: title_slug.to_string() }).unwrap(),
145145
};
146-
let Ok(data) = client.post(url).json(&query).send() else {
147-
return Err("Failed to fetch question id from leetcode!");
148-
};
146+
let data = client
147+
.post(url)
148+
.json(&query)
149+
.send()
150+
.wrap_err("Failed to fetch question id from LeetCode")?;
149151

150152
#[derive(Debug, Deserialize)]
151153
struct QuestionWrapper {
@@ -158,7 +160,7 @@ impl LeetCode<Authorized> {
158160
}
159161

160162
data.json::<Data>()
161-
.map_err(|_| "Failed to parse question id from leetcode!")
163+
.wrap_err("Failed to parse question id from LeetCode")
162164
.map(|opt| opt.data.question)
163165
}
164166
}

src/handlers/leetcode/api/submit.rs

Lines changed: 27 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
use crate::handlers::leetcode::*;
22

3+
use eyre::{bail, Context, Result};
4+
35
impl LeetCode<Authorized> {
4-
pub fn submit(&self, codefile: &CodeFile) -> Result<SubmissionResult, &str> {
6+
pub fn submit(&self, codefile: &CodeFile) -> Result<SubmissionResult> {
57
let question_title = codefile.question_title.clone();
68
let ques = self.question_metadata(&question_title)?;
79
let question_id = ques.questionId;
@@ -19,68 +21,59 @@ impl LeetCode<Authorized> {
1921
question_id: String,
2022
question_title: String,
2123
typed_code: String,
22-
) -> Result<SubmissionResult, &str> {
24+
) -> Result<SubmissionResult> {
25+
#[derive(Debug, Deserialize)]
26+
struct SubmissionID {
27+
submission_id: u32,
28+
}
29+
2330
let client = &self.client;
2431
let url = format!("https://leetcode.com/problems/{}/submit/", question_title);
2532
let submission = SubmitCode {
2633
lang,
2734
question_id,
2835
typed_code,
2936
};
30-
let Ok(data)= client.post(&url).json(&submission).send() else {
31-
return Err("Failed to parse arguments");
32-
};
33-
#[derive(Debug, Deserialize)]
34-
struct SubmissionID {
35-
submission_id: u32,
36-
}
37-
// println!("{}", data.text().unwrap());
38-
let Ok(data) = data.json::<SubmissionID>() else {
39-
return Err("Failed to fetch submission id from leetcode! Check your submissions manually on leetcode");
40-
};
37+
let data = client.post(&url).json(&submission).send()?.json::<SubmissionID>().wrap_err("Failed to fetch submission id from LeetCode, Check your submissions manually on leetcode")?;
38+
4139
println!("Evaluating solution...");
4240
let submission_id = data.submission_id;
4341
let mut last_state = PendingState::Unknown;
4442

4543
loop {
4644
let url = format!("https://leetcode.com/submissions/detail/{submission_id}/check/");
47-
let Ok(data) = client.get(&url).send() else {
48-
return Err("Failed to parse arguments!");
49-
};
45+
let data = client
46+
.get(&url)
47+
.send()?
48+
.json::<SubmissionResult>()
49+
.wrap_err(
50+
"Failed to fetch from leetcode! Try again after sometime or renew cookie",
51+
)?;
5052

51-
let Ok(data) = data.json::<SubmissionResult>() else {
52-
return Err("Failed to fetch from leetcode! Try again after sometime or renew cookie");
53-
};
5453
match data {
5554
SubmissionResult::PendingResult(data) => {
5655
let curr_state = data.state();
5756
match curr_state {
58-
PendingState::Pending => {
59-
if last_state != PendingState::Pending {
60-
println!("Status : Evaluation Pending");
61-
}
57+
PendingState::Pending if last_state != PendingState::Pending => {
58+
println!("Status : Evaluation Pending");
6259
}
63-
PendingState::Started => {
64-
if last_state != PendingState::Started {
65-
println!("Status : Execution Started");
66-
}
60+
PendingState::Started if last_state != PendingState::Started => {
61+
println!("Status : Execution Started");
6762
}
6863
PendingState::Success => {
69-
println!("Your code was executed successfully but we failed to parse result\nCheck on leetcode manually");
70-
std::process::exit(1);
64+
bail!("Your code was executed successfully but we failed to parse result\nCheck on leetcode manually");
7165
}
7266
PendingState::Unknown => {
73-
println!(
67+
bail!(
7468
"Status : {}\nKindly report this state to developer",
75-
data.state.as_str()
69+
data.state
7670
);
77-
std::process::exit(1);
7871
}
72+
_ => {}
7973
};
8074
last_state = curr_state;
81-
continue;
8275
}
83-
data => return Ok(data),
76+
not_pending_data => return Ok(not_pending_data),
8477
};
8578
}
8679
}

src/main.rs

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,16 +62,11 @@ fn main() -> Result<()> {
6262
testcases,
6363
filename,
6464
}) => {
65-
let success = execute_testcases(filename, Some(testcases), &lc).0;
66-
if !success {
67-
bail!("Failed to execute Testcases");
68-
};
65+
_ = execute_testcases(filename, Some(testcases), &lc)?;
66+
// bail if `is_correct == false`?
6967
}
7068
Some(Commands::Run { filename }) => {
71-
let success = execute_testcases(filename, None, &lc).0;
72-
if !success {
73-
bail!("Failed to execute"); // TODO: Fill the err message
74-
};
69+
_ = execute_testcases(filename, None, &lc)?;
7570
}
7671
Some(Commands::FastSubmit { filename }) => {
7772
let code_file = if let Some(path) = filename {
@@ -80,18 +75,16 @@ fn main() -> Result<()> {
8075
CodeFile::from_dir()
8176
};
8277

83-
submit(&lc, code_file); // TODO(nozwock): Use thiserror for SubmissionResult
78+
submit(&lc, code_file)?;
8479
}
8580
Some(Commands::Submit { filename }) => {
86-
let (testcase_result, code_file) = execute_testcases(filename, None, &lc);
87-
if testcase_result {
88-
submit(&lc, code_file);
81+
let (is_correct, code_file) = execute_testcases(filename, None, &lc)?;
82+
if is_correct {
83+
submit(&lc, code_file)?;
8984
} else {
9085
bail!(
9186
"{}",
92-
"Aborting submission due to failed testcase(s)!"
93-
.red()
94-
.bold()
87+
"Aborting submission due to failed testcase(s)".red().bold()
9588
);
9689
}
9790
}

0 commit comments

Comments
 (0)