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}