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>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<u64>,
}
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>),
Keyed {
#[serde(alias = "formations", alias = "cells")]
items: Vec<T>,
#[serde(default)]
cursor: Option<u64>,
},
}
Ok(match Wire::<T>::deserialize(d)? {
Wire::Bare(items) => List {
items,
cursor: None,
},
Wire::Keyed { items, cursor } => List { items, cursor },
})
}
}