@@ -6,7 +6,7 @@ use lazy_static::lazy_static;
66use regex:: Regex ;
77use serde:: {
88 de:: { self , Visitor } ,
9- Deserialize , Deserializer , Serialize ,
9+ Deserialize , Deserializer , Serialize , Serializer ,
1010} ;
1111use std:: fmt;
1212use 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 ) ]
240240pub 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
292292pub enum SubmissionProcessingStatus {
293293 Processing ( SubmissionProcessing ) ,
294294 Finished ( Box < SubmissionFinished > ) ,
295295}
296296
297- #[ derive( Debug , Deserialize ) ]
297+ #[ derive( Debug , Deserialize , Serialize ) ]
298298pub 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" ) ]
305305pub enum SandboxStatus {
306306 Created ,
307307 SendingToSandbox ,
308308 ProcessingOnSandbox ,
309309}
310310
311- #[ derive( Debug , Deserialize ) ]
311+ #[ derive( Debug , Deserialize , Serialize , PartialEq , Eq ) ]
312312pub 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 ) ]
354354pub 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 ) ]
363363pub struct SubmissionFeedbackQuestion {
364364 pub id : usize ,
365365 pub question : String ,
366366 pub kind : SubmissionFeedbackKind ,
367367}
368368
369- #[ derive( Debug ) ]
369+ #[ derive( Debug , PartialEq , Eq ) ]
370370pub 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+
384397struct 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