mooc_langs_api/exercise_services/
tmc.rs

1use 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}