1use serde::{Deserialize, Serialize};
12use serde_json::Value;
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct Cell {
17 #[serde(default)]
18 pub id: String,
19 #[serde(default)]
20 pub name: String,
21 #[serde(default)]
22 pub formation_id: Option<String>,
23 #[serde(default)]
25 pub state: String,
26 #[serde(default)]
27 pub image: Option<String>,
28 #[serde(default)]
29 pub critical: Option<bool>,
30 #[serde(default)]
31 pub created_at: Option<String>,
32 #[serde(default)]
33 pub started_at: Option<String>,
34 #[serde(default)]
35 pub finished_at: Option<String>,
36 #[serde(default)]
38 pub outcome: Option<String>,
39 #[serde(flatten, default)]
41 pub extra: serde_json::Map<String, Value>,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct Formation {
47 #[serde(default)]
48 pub id: String,
49 #[serde(default)]
50 pub name: String,
51 #[serde(default)]
53 pub state: String,
54 #[serde(default)]
55 pub tenant: Option<String>,
56 #[serde(default)]
57 pub cells: Vec<Cell>,
58 #[serde(default)]
59 pub created_at: Option<String>,
60 #[serde(default)]
61 pub updated_at: Option<String>,
62 #[serde(flatten, default)]
63 pub extra: serde_json::Map<String, Value>,
64}
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
69pub struct CloudEvent {
70 #[serde(default, alias = "specversion")]
71 pub spec_version: Option<String>,
72 #[serde(default)]
73 pub id: Option<String>,
74 #[serde(default)]
75 pub source: Option<String>,
76 #[serde(default, alias = "type")]
77 pub event_type: Option<String>,
78 #[serde(default)]
79 pub time: Option<String>,
80 #[serde(default)]
81 pub subject: Option<String>,
82 #[serde(default)]
83 pub data: Option<Value>,
84 #[serde(flatten, default)]
85 pub extra: serde_json::Map<String, Value>,
86}
87
88#[derive(Debug, Clone, Serialize)]
91pub struct List<T> {
92 pub items: Vec<T>,
93}
94
95impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for List<T> {
96 fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
97 #[derive(Deserialize)]
98 #[serde(untagged)]
99 enum Wire<T> {
100 Bare(Vec<T>),
101 Wrapped { items: Vec<T> },
102 }
103 Ok(match Wire::<T>::deserialize(d)? {
104 Wire::Bare(items) => List { items },
105 Wire::Wrapped { items } => List { items },
106 })
107 }
108}