#![allow(unconditional_recursion)]
use serde::{ser::SerializeStruct, Deserialize, Serialize};
pub mod config;
use config::StageConfig;
#[derive(Debug, Clone)]
pub struct StageProvider<'a> {
pub inner: Option<&'a dyn Stage>,
}
impl PartialEq for StageProvider<'_> {
fn eq(&self, other: &Self) -> bool {
self.inner
.is_some_and(|i| other.inner.is_some_and(|o| o.name() == i.name()))
}
}
impl<'a> Serialize for StageProvider<'a> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
let state = serializer.serialize_struct("StageProvider", 1)?;
state.end()
}
}
impl<'a> Deserialize<'a> for StageProvider<'a> {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'a>,
{
let stage_provider: StageProvider<'a> = serde::Deserialize::deserialize(deserializer)?;
Ok(stage_provider)
}
}
pub trait Stage: std::fmt::Debug + Send + Sync {
fn config(&self) -> &StageConfig;
fn name(&self) -> &str;
}