use alloc::string::String;
use core::any::Any;
use crate::context::{ChainFlags, TypeMap};
pub struct QueryCtx<'a> {
pub target: Option<&'a dyn Any>,
pub chain: Option<&'a ChainFlags>,
pub caps: &'a TypeMap,
}
impl QueryCtx<'_> {
#[must_use]
pub fn target_as<T: Any>(&self) -> Option<&T> {
self.target.and_then(|target| target.downcast_ref::<T>())
}
#[must_use]
pub fn service<T: Any>(&self) -> Option<&T> {
self.caps.get::<T>()
}
}
pub struct EffectCtx<'a> {
pub target: Option<&'a dyn Any>,
pub chain: Option<&'a mut ChainFlags>,
pub caps: &'a mut TypeMap,
}
impl EffectCtx<'_> {
#[must_use]
pub fn target_as<T: Any>(&self) -> Option<&T> {
self.target.and_then(|target| target.downcast_ref::<T>())
}
#[must_use]
pub fn service<T: Any>(&self) -> Option<&T> {
self.caps.get::<T>()
}
pub fn service_mut<T: Any>(&mut self) -> Option<&mut T> {
self.caps.get_mut::<T>()
}
}
pub trait Condition {
fn summary(&self) -> String;
fn warning(&self) -> Option<String> {
None
}
fn evaluate(&self, query: &QueryCtx<'_>) -> bool;
}
pub trait Effect {
fn summary(&self) -> String;
fn warning(&self) -> Option<String> {
None
}
fn apply(&self, effect_ctx: &mut EffectCtx<'_>);
}