sea_core/calm/
models.rs

1use serde::{Deserialize, Serialize};
2use serde_json::Value;
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
6pub struct CalmModel {
7    #[serde(default = "default_version")]
8    pub version: String,
9
10    pub metadata: CalmMetadata,
11    pub nodes: Vec<CalmNode>,
12    pub relationships: Vec<CalmRelationship>,
13}
14
15fn default_version() -> String {
16    "2.0".to_string()
17}
18
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct CalmMetadata {
21    #[serde(rename = "sea:exported")]
22    pub sea_exported: bool,
23
24    #[serde(rename = "sea:version")]
25    pub sea_version: String,
26
27    #[serde(rename = "sea:timestamp", skip_serializing_if = "Option::is_none")]
28    pub sea_timestamp: Option<String>,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct CalmNode {
33    #[serde(rename = "unique-id")]
34    pub unique_id: String,
35
36    #[serde(rename = "node-type")]
37    pub node_type: NodeType,
38
39    pub name: String,
40
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub namespace: Option<String>,
43
44    #[serde(default)]
45    pub metadata: HashMap<String, Value>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "lowercase")]
50pub enum NodeType {
51    Actor,
52    Location,
53    Resource,
54    Instance,
55    Constraint,
56}
57
58#[derive(Debug, Clone, Serialize, Deserialize)]
59pub struct CalmRelationship {
60    #[serde(rename = "unique-id")]
61    pub unique_id: String,
62
63    #[serde(rename = "relationship-type")]
64    pub relationship_type: RelationshipType,
65
66    pub parties: Parties,
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize)]
70#[serde(untagged)]
71pub enum RelationshipType {
72    Flow { flow: FlowDetails },
73    Simple(String),
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct FlowDetails {
78    pub resource: String,
79    pub quantity: String,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
83#[serde(untagged)]
84pub enum Parties {
85    SourceDestination { source: String, destination: String },
86    OwnerOwned { owner: String, owned: String },
87}
88
89impl CalmModel {
90    pub fn new() -> Self {
91        CalmModel {
92            version: "2.0".to_string(),
93            metadata: CalmMetadata {
94                sea_exported: true,
95                sea_version: crate::VERSION.to_string(),
96                sea_timestamp: None,
97            },
98            nodes: Vec::new(),
99            relationships: Vec::new(),
100        }
101    }
102}
103
104impl Default for CalmModel {
105    fn default() -> Self {
106        Self::new()
107    }
108}