catcolab_document_types/v1/
document.rs

1use crate::v0;
2use crate::v0::AnalysisType;
3pub use crate::v0::document::DocumentType;
4
5use super::analysis::Analysis;
6use super::api::Link;
7use super::notebook::Notebook;
8
9use serde::{Deserialize, Serialize};
10
11/// This is the content of a model document. For legacy reasons, we reserve
12/// the name "ModelDocument" for `Document & { type: "model" }`.
13#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
14pub struct ModelDocumentContent {
15    pub name: String,
16    pub theory: String,
17    #[serde(
18        default,
19        skip_serializing_if = "Option::is_none",
20        rename = "editorVariant"
21    )]
22    pub editor_variant: Option<String>,
23    pub notebook: Notebook<super::model_judgment::ModelJudgment>,
24    pub version: String,
25}
26
27#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
28pub struct DiagramDocumentContent {
29    pub name: String,
30    #[serde(rename = "diagramIn")]
31    pub diagram_in: Link,
32    pub notebook: Notebook<super::diagram_judgment::DiagramJudgment>,
33    pub version: String,
34}
35
36#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
37pub struct AnalysisDocumentContent {
38    pub name: String,
39    #[serde(rename = "analysisType")]
40    pub analysis_type: AnalysisType,
41    #[serde(rename = "analysisOf")]
42    pub analysis_of: Link,
43    pub notebook: Notebook<Analysis>,
44    pub version: String,
45}
46
47#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
48#[serde(tag = "type")]
49pub enum Document {
50    #[serde(rename = "model")]
51    Model(ModelDocumentContent),
52    #[serde(rename = "diagram")]
53    Diagram(DiagramDocumentContent),
54    #[serde(rename = "analysis")]
55    Analysis(AnalysisDocumentContent),
56}
57
58impl Document {
59    pub fn migrate_from_v0(old: v0::Document) -> Self {
60        match old {
61            v0::Document::Model(old) => Document::Model(ModelDocumentContent {
62                name: old.name,
63                theory: old.theory,
64                editor_variant: None,
65                notebook: Notebook::migrate_from_v0(old.notebook),
66                version: "1".to_string(),
67            }),
68
69            v0::Document::Diagram(old) => Document::Diagram(DiagramDocumentContent {
70                name: old.name,
71                diagram_in: old.diagram_in,
72                notebook: Notebook::migrate_from_v0(old.notebook),
73                version: "1".to_string(),
74            }),
75
76            v0::Document::Analysis(old) => Document::Analysis(AnalysisDocumentContent {
77                name: old.name,
78                analysis_type: old.analysis_type,
79                analysis_of: old.analysis_of,
80                notebook: Notebook::migrate_from_v0(old.notebook),
81                version: "1".to_string(),
82            }),
83        }
84    }
85}