catcolab_document_types/v0/
document.rs

1use super::analysis::Analysis;
2use super::api::Link;
3use super::diagram_judgment::DiagramJudgment;
4use super::model_judgment::ModelJudgment;
5use super::notebook::Notebook;
6
7use std::str::FromStr;
8
9use serde::{Deserialize, Serialize};
10use tsify::Tsify;
11
12/// The content of a model document. For legacy reasons, we reserve the name
13/// `ModelDocument` for the type `Document & { type: "model" }`.
14#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
15pub struct ModelDocumentContent {
16    pub name: String,
17    pub theory: String,
18    pub notebook: Notebook<ModelJudgment>,
19}
20
21#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
22pub struct DiagramDocumentContent {
23    pub name: String,
24    #[serde(rename = "diagramIn")]
25    pub diagram_in: Link,
26    pub notebook: Notebook<DiagramJudgment>,
27}
28
29#[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Tsify)]
30#[tsify(into_wasm_abi, from_wasm_abi)]
31pub enum AnalysisType {
32    #[serde(rename = "model")]
33    Model,
34    #[serde(rename = "diagram")]
35    Diagram,
36}
37
38#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
39pub struct AnalysisDocumentContent {
40    pub name: String,
41    #[serde(rename = "analysisType")]
42    pub analysis_type: AnalysisType,
43    #[serde(rename = "analysisOf")]
44    pub analysis_of: Link,
45    pub notebook: Notebook<Analysis>,
46}
47
48/// The type/kind of a document, without any associated content.
49#[derive(PartialEq, Eq, Debug, Clone, Copy, Serialize, Deserialize, Tsify)]
50#[cfg_attr(
51    feature = "backend",
52    derive(autosurgeon::Reconcile, autosurgeon::Hydrate, ts_rs::TS)
53)]
54#[cfg_attr(
55    feature = "backend",
56    ts(export_to = "user_state.ts", rename_all = "lowercase")
57)]
58#[serde(rename_all = "lowercase")]
59#[tsify(into_wasm_abi, from_wasm_abi)]
60pub enum DocumentType {
61    #[cfg_attr(feature = "backend", autosurgeon(rename = "model"))]
62    Model,
63    #[cfg_attr(feature = "backend", autosurgeon(rename = "diagram"))]
64    Diagram,
65    #[cfg_attr(feature = "backend", autosurgeon(rename = "analysis"))]
66    Analysis,
67}
68
69impl FromStr for DocumentType {
70    type Err = String;
71
72    fn from_str(s: &str) -> Result<Self, Self::Err> {
73        match s {
74            "model" => Ok(DocumentType::Model),
75            "diagram" => Ok(DocumentType::Diagram),
76            "analysis" => Ok(DocumentType::Analysis),
77            other => Err(format!("unknown document type: {other}")),
78        }
79    }
80}
81
82#[derive(PartialEq, Eq, Debug, Serialize, Deserialize)]
83#[serde(tag = "type")]
84pub enum Document {
85    #[serde(rename = "model")]
86    Model(ModelDocumentContent),
87    #[serde(rename = "diagram")]
88    Diagram(DiagramDocumentContent),
89    #[serde(rename = "analysis")]
90    Analysis(AnalysisDocumentContent),
91}