use serde::{Deserialize, Serialize};
use crate::resource::{ResourceKey, ResourceValue};
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct WatchEvent {
#[serde(rename = "type")]
pub kind: WatchEventKind,
pub object: ResourceValue,
pub key: ResourceKey,
pub resource_version: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum WatchEventKind {
Added,
Modified,
Deleted,
Bookmark,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn watch_event_serializes_as_k8s_format() {
let ev = WatchEvent {
kind: WatchEventKind::Added,
object: serde_json::json!({"kind": "Pod"}),
key: ResourceKey::namespaced("", "v1", "Pod", "default", "x"),
resource_version: 42,
};
let s = serde_json::to_string(&ev).unwrap();
assert!(s.contains("\"type\":\"ADDED\""), "got: {s}");
let back: WatchEvent = serde_json::from_str(&s).unwrap();
assert_eq!(back.kind, WatchEventKind::Added);
assert_eq!(back.resource_version, 42);
}
#[test]
fn watch_event_kinds_round_trip() {
for k in [
WatchEventKind::Added,
WatchEventKind::Modified,
WatchEventKind::Deleted,
WatchEventKind::Bookmark,
] {
let s = serde_json::to_string(&k).unwrap();
let back: WatchEventKind = serde_json::from_str(&s).unwrap();
assert_eq!(back, k);
}
}
}