Skip to content

Commit 7fb1894

Browse files
committed
feat(leetcode-api): add append last test case function.
1 parent 8574729 commit 7fb1894

File tree

5 files changed

+103
-19
lines changed

5 files changed

+103
-19
lines changed

Cargo.lock

+12-13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/leetcode-api/src/dao/save_info.rs

+26-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ use crate::{
1414
render::Render,
1515
};
1616

17-
/// write info to file
17+
/// Contains file's info,
18+
/// Useful for write some content to question's files.
1819
#[derive(Clone)]
1920
#[derive(Debug)]
2021
#[derive(Default)]
@@ -25,6 +26,29 @@ pub struct FileInfo {
2526
pub content_path: PathBuf,
2627
}
2728

29+
impl FileInfo {
30+
/// When submit have testcase failed, can call it.
31+
pub async fn append_test_case(&self, case: &str) -> Result<()> {
32+
if case.is_empty() {
33+
return Ok(());
34+
}
35+
36+
let mut f = OpenOptions::new()
37+
.append(true)
38+
.open(&self.test_case_path)
39+
.await
40+
.into_diagnostic()?;
41+
42+
f.write_all(b"\n")
43+
.await
44+
.into_diagnostic()?;
45+
f.write_all(case.as_bytes())
46+
.await
47+
.into_diagnostic()?;
48+
Ok(())
49+
}
50+
}
51+
2852
impl FileInfo {
2953
/// Get code, test, content dir
3054
#[instrument]
@@ -63,6 +87,7 @@ impl FileInfo {
6387
content_path,
6488
})
6589
}
90+
6691
/// Write a question's `content`, `code` and `test_case` to file
6792
pub async fn write_to_file(&self, detail: &Question) -> Result<()> {
6893
let content = detail.to_md_str(true);

crates/leetcode-api/src/leetcode/impl_lc/judge.rs

+20-4
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,7 @@ impl LeetCode {
5959
},
6060
};
6161

62-
let last_sub_result = self
63-
.get_one_submit_res(&sub_info)
64-
.await?;
62+
let last_sub_result = self.get_submit_res(&sub_info).await?;
6563
debug!("last submit result: {:#?}", last_sub_result);
6664

6765
Ok((sub_info, last_sub_result))
@@ -70,7 +68,7 @@ impl LeetCode {
7068
/// Get one submit info
7169
///
7270
/// * `sub_id`: be fetch `submission_id`
73-
pub async fn get_one_submit_res(&self, sub_id: &SubmitInfo) -> Result<RunResult> {
71+
pub async fn get_submit_res(&self, sub_id: &SubmitInfo) -> Result<RunResult> {
7472
let test_res_url = G_USER_CONFIG
7573
.urls
7674
.mod_submissions(&sub_id.submission_id().to_string());
@@ -93,6 +91,24 @@ impl LeetCode {
9391
)
9492
.build())
9593
}
94+
pub async fn add_last_test_case(&self, submit_res: &RunResult) -> Result<()> {
95+
let case = &submit_res.last_testcase;
96+
if case.is_empty() {
97+
return Ok(());
98+
}
99+
let pb = Query::get_question_index(&IdSlug::Id(
100+
submit_res
101+
.question_id
102+
.parse()
103+
.expect("submit res question id parse error"),
104+
))
105+
.await?;
106+
107+
let info = FileInfo::build(&pb).await?;
108+
info.append_test_case(case).await?;
109+
110+
Ok(())
111+
}
96112

97113
/// Get all submission results for a question
98114
pub async fn all_submit_res(&self, idslug: IdSlug) -> Result<SubmissionList> {

crates/leetcode-api/tests/lc_manual.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ async fn submit_work() {
3636

3737
let (_, res) = glob_leetcode()
3838
.await
39-
.submit_code(IdSlug::Id(27))
39+
.submit_code(IdSlug::Id(100345))
4040
.await
4141
.unwrap();
42+
dbg!(&res);
4243
dbg!(res.to_para_vec());
4344
println!(r##"(| res |) -> {} "##, res.to_md_str(false));
4445
res.render_with_mdcat();

sample/submit/SubmissionDetail.txt

+43
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,46 @@ correct
7474
},
7575
)
7676

77+
78+
----
79+
80+
81+
[crates/leetcode-api/tests/lc_manual.rs:42:5] &res = RunResult {
82+
elapsed_time: 0,
83+
finished: true,
84+
task_name: "judger.judgetask.Judge",
85+
status_code: 20,
86+
status_msg: "Compile Error",
87+
question_id: "100345",
88+
std_output: "",
89+
expected_output: "",
90+
last_testcase: "",
91+
code_answer: [],
92+
compare_result: "",
93+
correct_answer: false,
94+
expected_code_answer: [],
95+
expected_code_output: [],
96+
pretty_lang: "Rust",
97+
lang: "rust",
98+
memory: 0,
99+
status_memory: "N/A",
100+
memory_percentile: None,
101+
status_runtime: "N/A",
102+
runtime_percentile: None,
103+
run_success: false,
104+
state: "SUCCESS",
105+
std_output_list: [],
106+
submission_id: "535418998",
107+
task_finish_time: 1716882420090,
108+
total_correct: None,
109+
total_testcases: None,
110+
full_runtime_error: "",
111+
runtime_error: "",
112+
compile_error: "Line 46: Char 29: error: no function or associated item named `mechanical_accumulator` found for struct `Solution` in the current scop
113+
e (solution.rs)",
114+
full_compile_error: "Line 46: Char 29: error: no function or associated item named `mechanical_accumulator` found for struct `Solution` in the current
115+
scope (solution.rs)\n |\n31 | struct Solution;\n | --------------- function or associated item `mechanical_accumulator` not found for this struct\n..
116+
.\n46 | let ret = Solution::mechanical_accumulator(param_1);\n | ^^^^^^^^^^^^^^^^^^^^^^ function or associated item
117+
not found in `Solution`\nFor more information about this error, try `rustc --explain E0599`.\nerror: could not compile `prog` (bin \"prog\") due to previo
118+
us error",
119+
}

0 commit comments

Comments
 (0)