use std::any::{Any, TypeId};
use std::fmt::Debug;
use crate::effects::RoleId;
pub trait ExtensionEffect<R: RoleId>: Send + Sync + Debug {
fn type_id(&self) -> TypeId;
fn type_name(&self) -> &'static str;
fn participating_roles(&self) -> Vec<R> {
vec![] }
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn clone_box(&self) -> Box<dyn ExtensionEffect<R>>;
}
#[derive(Debug, Clone, thiserror::Error)]
pub enum ExtensionError {
#[error("Unknown extension type: {type_name} (TypeId: {type_id:?})")]
UnknownExtension {
type_name: &'static str,
type_id: TypeId,
},
#[error("Extension handler not registered for {type_name}")]
HandlerNotRegistered { type_name: &'static str },
#[error("Extension {type_name} failed: {error}")]
ExecutionFailed {
type_name: &'static str,
error: String,
},
#[error("Type mismatch: expected {expected}, got {actual}")]
TypeMismatch {
expected: &'static str,
actual: &'static str,
},
#[error("Handler already registered for extension type: {type_name}")]
DuplicateHandler { type_name: &'static str },
#[error("Cannot merge registries: duplicate handler for {type_name}")]
MergeConflict { type_name: &'static str },
}