use kube::{api::DynamicObject, api::ResourceExt, Resource};
use kube_runtime::watcher::Event;
use serde::de::DeserializeOwned;
#[derive(Debug)]
pub enum PrettyEvent {
Applied {
name: String,
namespace: Option<String>,
},
Deleted {
name: String,
namespace: Option<String>,
},
Restarted {
count: usize,
},
}
impl<R: Resource> From<&Event<R>> for PrettyEvent {
fn from(event: &Event<R>) -> Self {
match event {
Event::Applied(object) => PrettyEvent::Applied {
name: object.name(),
namespace: object.namespace(),
},
Event::Deleted(object) => PrettyEvent::Deleted {
name: object.name(),
namespace: object.namespace(),
},
Event::Restarted(objects) => PrettyEvent::Restarted {
count: objects.len(),
},
}
}
}
pub fn concrete_object<R>(dynamic_object: DynamicObject) -> anyhow::Result<R>
where
R: DeserializeOwned,
{
let value = serde_json::to_value(&dynamic_object)?;
Ok(serde_json::from_value::<R>(value)?)
}
pub fn concrete_event<R>(dynamic_event: DynamicEvent) -> anyhow::Result<Event<R>>
where
R: DeserializeOwned,
{
match dynamic_event {
Event::Applied(dynamic_object) => Ok(Event::Applied(concrete_object(dynamic_object)?)),
Event::Deleted(dynamic_object) => Ok(Event::Deleted(concrete_object(dynamic_object)?)),
Event::Restarted(dynamic_objects) => Ok(Event::Restarted(
dynamic_objects
.into_iter()
.map(concrete_object)
.collect::<anyhow::Result<Vec<R>>>()?,
)),
}
}
pub type DynamicEvent = Event<DynamicObject>;