use serde::Serialize;
use std::fmt::Debug;
use crate::object::{ObjectState, ObjectStatus};
use crate::state::{SharedState, State};
use crate::Manifest;
use kube::api::Resource;
#[cfg(feature = "admission-webhook")]
use crate::admission::AdmissionTls;
pub trait Watchable:
Resource<DynamicType = ()> + serde::de::DeserializeOwned + Clone + Send + 'static
{
}
impl<T> Watchable for T where
T: Resource<DynamicType = ()> + serde::de::DeserializeOwned + Clone + Send + 'static
{
}
#[async_trait::async_trait]
pub trait Operator: 'static + Sync + Send {
type Manifest: Watchable + Serialize + Debug + Sync + Default + std::marker::Unpin;
type Status: ObjectStatus + Send;
type ObjectState: ObjectState<Manifest = Self::Manifest, Status = Self::Status>;
type InitialState: State<Self::ObjectState> + Default;
type DeletedState: State<Self::ObjectState> + Default;
async fn initialize_object_state(
&self,
manifest: &Self::Manifest,
) -> anyhow::Result<Self::ObjectState>;
async fn shared_state(&self) -> SharedState<<Self::ObjectState as ObjectState>::SharedState>;
async fn registration_hook(
&self,
mut _manifest: Manifest<Self::Manifest>,
) -> anyhow::Result<()> {
Ok(())
}
#[cfg(feature = "admission-webhook")]
async fn admission_hook(
&self,
manifest: Self::Manifest,
) -> crate::admission::AdmissionResult<Self::Manifest>;
#[cfg(feature = "admission-webhook")]
async fn admission_hook_tls(&self) -> anyhow::Result<AdmissionTls>;
async fn deregistration_hook(
&self,
mut _manifest: Manifest<Self::Manifest>,
) -> anyhow::Result<()> {
Ok(())
}
}