mooc_langs_api/exercise_services/
tmc.rs1use serde::{Deserialize, Serialize};
2use std::fmt::Debug;
3
4#[derive(Debug, Serialize, Deserialize)]
5pub struct ExerciseTaskInfo {
6 pub assignment: serde_json::Value,
7 pub public_spec: Option<PublicSpec>,
8 pub model_solution_spec: Option<ModelSolutionSpec>,
9}
10
11#[derive(Debug, Serialize, Deserialize)]
12#[serde(tag = "type")]
13#[serde(rename_all = "lowercase")]
14pub enum PublicSpec {
15 Browser {
16 files: Vec<ExerciseFile>,
17 },
18 Editor {
19 archive_name: String,
20 archive_download_url: String,
21 },
22}
23
24#[derive(Debug, Serialize, Deserialize)]
25pub struct ExerciseFile {
26 filepath: String,
27 contents: String,
28}
29
30#[derive(Debug, Serialize, Deserialize)]
31#[serde(tag = "type")]
32#[serde(rename_all = "lowercase")]
33pub enum ModelSolutionSpec {
34 Browser {
35 files: Vec<ExerciseFile>,
36 },
37 Editor {
38 archive_name: String,
39 archive_download_url: String,
40 },
41}
42
43#[cfg(test)]
44mod test {
45 use super::*;
46
47 #[test]
48 fn deserializes_browser_public_spec() {
49 let browser_task = r#"
50{
51 "type": "browser",
52 "files": [
53 {
54 "filepath": "1",
55 "contents": "2"
56 },
57 {
58 "filepath": "3",
59 "contents": "4"
60 }
61 ]
62}
63"#;
64 serde_json::from_str::<PublicSpec>(browser_task).unwrap();
65 }
66
67 #[test]
68 fn deserializes_editor_public_spec() {
69 let editor_task = r#"
70{
71 "type": "editor",
72 "archive_name": "1",
73 "archive_download_url": "2"
74}
75"#;
76 serde_json::from_str::<PublicSpec>(editor_task).unwrap();
77 }
78}