use super::asked::Asked;
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct SchemaRow {
pub producer: String,
pub type_name: String,
pub kind: String,
pub hash: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub document: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize)]
pub struct SchemaDump {
pub producer: String,
pub served: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub app: Option<String>,
pub types: Vec<SchemaRow>,
#[serde(skip_serializing_if = "Asked::is_not_asked", default)]
pub missing: Asked<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct SchemaServer {
pub producer: String,
pub origin: String,
#[serde(skip_serializing_if = "Asked::is_not_asked")]
pub hash: Asked<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize)]
#[serde(rename_all = "snake_case")]
pub enum DriftVerdict {
Disagree,
Unjudgeable,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct SchemaDrift {
pub type_name: String,
pub servers: Vec<SchemaServer>,
pub verdict: DriftVerdict,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize)]
pub struct TotalityGap {
pub producer: String,
pub missing: Vec<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn schema_drift_json_shape_is_pinned() {
let drift = SchemaDrift {
type_name: "Health".into(),
servers: vec![
SchemaServer {
producer: "sysinfo".into(),
origin: "h-3fa9c2d41b7e".into(),
hash: Asked::Asked("sha256:abc".into()),
},
SchemaServer {
producer: "sysinfo".into(),
origin: "h-8b1e07af22c9".into(),
hash: Asked::NotAsked,
},
],
verdict: DriftVerdict::Disagree,
};
assert_eq!(
serde_json::to_value(&drift).expect("serialize"),
serde_json::json!({
"type_name": "Health",
"servers": [
{
"producer": "sysinfo",
"origin": "h-3fa9c2d41b7e",
"hash": "sha256:abc",
},
{
"producer": "sysinfo",
"origin": "h-8b1e07af22c9",
},
],
"verdict": "disagree",
})
);
}
}