Skip to content

Commit 728c216

Browse files
committed
serialize response types
1 parent 28f8e14 commit 728c216

File tree

1 file changed

+67
-9
lines changed

1 file changed

+67
-9
lines changed

tmc-langs-core/src/response.rs

Lines changed: 67 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use lazy_static::lazy_static;
66
use regex::Regex;
77
use serde::{
88
de::{self, Visitor},
9-
Deserialize, Deserializer, Serialize,
9+
Deserialize, Deserializer, Serialize, Serializer,
1010
};
1111
use std::fmt;
1212
use std::str::FromStr;
@@ -236,7 +236,7 @@ pub struct ExerciseDetails {
236236
pub submissions: Vec<ExerciseSubmission>,
237237
}
238238

239-
#[derive(Debug, Deserialize)]
239+
#[derive(Debug, Deserialize, Serialize)]
240240
pub struct Submission {
241241
pub id: usize,
242242
pub user_id: usize,
@@ -287,28 +287,28 @@ pub struct NewSubmission {
287287
pub submission_url: String,
288288
}
289289

290-
#[derive(Debug, Deserialize)]
290+
#[derive(Debug, Deserialize, Serialize)]
291291
#[serde(untagged)] // TODO: tag
292292
pub enum SubmissionProcessingStatus {
293293
Processing(SubmissionProcessing),
294294
Finished(Box<SubmissionFinished>),
295295
}
296296

297-
#[derive(Debug, Deserialize)]
297+
#[derive(Debug, Deserialize, Serialize)]
298298
pub struct SubmissionProcessing {
299299
// pub status: SubmissionStatus // always Processing
300300
pub sandbox_status: SandboxStatus,
301301
}
302302

303-
#[derive(Debug, Deserialize, PartialEq, Eq)]
303+
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)]
304304
#[serde(rename_all = "snake_case")]
305305
pub enum SandboxStatus {
306306
Created,
307307
SendingToSandbox,
308308
ProcessingOnSandbox,
309309
}
310310

311-
#[derive(Debug, Deserialize)]
311+
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
312312
pub struct SubmissionFinished {
313313
pub api_version: usize,
314314
pub all_tests_passed: Option<bool>,
@@ -350,7 +350,7 @@ pub struct SubmissionFeedbackResponse {
350350
pub status: SubmissionStatus,
351351
}
352352

353-
#[derive(Debug, Deserialize)]
353+
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
354354
pub struct TestCase {
355355
pub name: String,
356356
pub successful: bool,
@@ -359,14 +359,14 @@ pub struct TestCase {
359359
pub detailed_message: Option<String>,
360360
}
361361

362-
#[derive(Debug, Deserialize)]
362+
#[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
363363
pub struct SubmissionFeedbackQuestion {
364364
pub id: usize,
365365
pub question: String,
366366
pub kind: SubmissionFeedbackKind,
367367
}
368368

369-
#[derive(Debug)]
369+
#[derive(Debug, PartialEq, Eq)]
370370
pub enum SubmissionFeedbackKind {
371371
Text,
372372
IntRange { lower: usize, upper: usize },
@@ -381,6 +381,19 @@ impl<'de> Deserialize<'de> for SubmissionFeedbackKind {
381381
}
382382
}
383383

384+
impl Serialize for SubmissionFeedbackKind {
385+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
386+
where
387+
S: Serializer,
388+
{
389+
let s = match self {
390+
Self::Text => "text".to_string(),
391+
Self::IntRange { lower, upper } => format!("intrange[{}..{}]", lower, upper),
392+
};
393+
serializer.serialize_str(&s)
394+
}
395+
}
396+
384397
struct SubmissionFeedbackKindVisitor {}
385398

386399
// parses "text" into Text, and "intrange[x..y]" into IntRange {lower: x, upper: y}
@@ -496,4 +509,49 @@ mod test {
496509
panic!("wrong type")
497510
}
498511
}
512+
513+
#[test]
514+
fn feedback_kind_se() {
515+
init();
516+
use serde_json::Value;
517+
518+
let text = SubmissionFeedbackKind::Text;
519+
let text = serde_json::to_value(&text).unwrap();
520+
assert_eq!(text, Value::String("text".to_string()));
521+
522+
let range = SubmissionFeedbackKind::IntRange { lower: 1, upper: 5 };
523+
let range = serde_json::to_value(&range).unwrap();
524+
assert_eq!(range, Value::String("intrange[1..5]".to_string()));
525+
}
526+
527+
#[test]
528+
fn deserializes_struct_with_error_field() {
529+
let json = r#"{
530+
"api_version": 7,
531+
"all_tests_passed": false,
532+
"user_id": 123,
533+
"login": "log",
534+
"course": "cou",
535+
"exercise_name": "exe",
536+
"status": "error",
537+
"points": [],
538+
"validations": null,
539+
"valgrind": null,
540+
"submission_url": "sub",
541+
"solution_url": "sol",
542+
"submitted_at": "sat",
543+
"processing_time": null,
544+
"reviewed": false,
545+
"requests_review": false,
546+
"paste_url": null,
547+
"message_for_paste": null,
548+
"missing_review_points": [],
549+
"error": "error msg"
550+
}"#;
551+
let s: Response<SubmissionProcessingStatus> = serde_json::from_str(json).unwrap();
552+
if let Response::Ok(_) = s {
553+
} else {
554+
panic!("parse failed")
555+
}
556+
}
499557
}

0 commit comments

Comments
 (0)