use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Cell {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default)]
pub formation_id: Option<String>,
#[serde(default)]
pub state: String,
#[serde(default)]
pub image: Option<String>,
#[serde(default)]
pub critical: Option<bool>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub started_at: Option<String>,
#[serde(default)]
pub finished_at: Option<String>,
#[serde(default)]
pub outcome: Option<String>,
#[serde(flatten, default)]
pub extra: serde_json::Map<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Formation {
#[serde(default)]
pub id: String,
#[serde(default)]
pub name: String,
#[serde(default, alias = "status")]
pub state: String,
#[serde(default)]
pub tenant: Option<String>,
#[serde(default)]
pub cells: Vec<Cell>,
#[serde(default)]
pub created_at: Option<String>,
#[serde(default)]
pub updated_at: Option<String>,
#[serde(flatten, default)]
pub extra: serde_json::Map<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CloudEvent {
#[serde(default, alias = "specversion")]
pub spec_version: Option<String>,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub source: Option<String>,
#[serde(default, alias = "type")]
pub event_type: Option<String>,
#[serde(default)]
pub time: Option<String>,
#[serde(default)]
pub subject: Option<String>,
#[serde(default)]
pub data: Option<Value>,
#[serde(flatten, default)]
pub extra: serde_json::Map<String, Value>,
}
#[derive(Debug, Clone, Serialize)]
pub struct List<T> {
pub items: Vec<T>,
}
impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for List<T> {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
#[derive(Deserialize)]
#[serde(untagged)]
enum Wire<T> {
Bare(Vec<T>),
Wrapped { items: Vec<T> },
}
Ok(match Wire::<T>::deserialize(d)? {
Wire::Bare(items) => List { items },
Wire::Wrapped { items } => List { items },
})
}
}