use std::borrow::Cow;
use k8s_openapi::apimachinery::pkg::apis::meta::v1::APIResource;
use kube::{
Resource,
api::{ObjectMeta, TypeMeta},
core::DynamicResourceScope,
};
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug, PartialEq)]
pub struct DynamicObject {
#[serde(flatten, default)]
pub types: Option<TypeMeta>,
#[serde(default)]
pub metadata: ObjectMeta,
#[serde(flatten)]
pub data: serde_json::Value,
}
impl Resource for DynamicObject {
type DynamicType = APIResource;
type Scope = DynamicResourceScope;
fn group(dt: &APIResource) -> Cow<'_, str> {
let group = dt.group.as_deref().unwrap();
if group == "core" {
"".into()
} else {
group.into()
}
}
fn version(dt: &APIResource) -> Cow<'_, str> {
dt.version.as_deref().unwrap().into()
}
fn kind(dt: &APIResource) -> Cow<'_, str> {
dt.kind.as_str().into()
}
fn api_version(dt: &APIResource) -> Cow<'_, str> {
if dt.group.as_deref().unwrap() == "core" {
dt.version.as_deref().unwrap().into()
} else {
format!(
"{}/{}",
dt.group.as_deref().unwrap(),
dt.version.as_deref().unwrap()
)
.into()
}
}
fn plural(dt: &APIResource) -> Cow<'_, str> {
dt.name.as_str().into()
}
fn meta(&self) -> &ObjectMeta {
&self.metadata
}
fn meta_mut(&mut self) -> &mut ObjectMeta {
&mut self.metadata
}
}