use std::sync::atomic::{AtomicU64, Ordering};
use super::PluginDefinition;
use crate::{Error, Result};
static NEXT_GENERATION: AtomicU64 = AtomicU64::new(1);
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct PluginGeneration(u64);
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PluginStatus {
pub id: String,
pub definition: Option<PluginDefinition>,
pub active_definition: Option<PluginDefinition>,
pub generation: Option<PluginGeneration>,
pub state: PluginState,
pub attempts: u64,
pub last_failure: Option<String>,
pub cleanup_pending: bool,
pub failure_class: Option<PluginFailureClass>,
pub next_retry: Option<tokio::time::Instant>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PluginFailureClass {
Recoverable,
Terminal,
Cancelled,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum PluginState {
Registered,
Initializing,
Ready,
Stopping,
Failed,
}
impl PluginGeneration {
pub fn get(self) -> u64 {
self.0
}
pub(super) fn fresh() -> Result<Self> {
NEXT_GENERATION
.try_update(Ordering::Relaxed, Ordering::Relaxed, |next| next.checked_add(1))
.map(Self)
.map_err(|_| Error::ResourceExhausted { resource: "plugin generations" })
}
}