use std::any::TypeId;
use std::fmt;
use crate::engine::types::ComponentID;
#[non_exhaustive]
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum RegistryError {
Frozen,
CapacityExceeded {
cap: usize,
},
NotRegistered {
type_id: TypeId,
},
MissingFactory {
component_id: ComponentID,
},
InvalidComponentId {
component_id: ComponentID,
cap: usize,
},
ComponentIdNotRegistered {
component_id: ComponentID,
},
ZeroSizedComponent {
type_id: TypeId,
},
PoisonedLock,
}
impl fmt::Display for RegistryError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RegistryError::Frozen => f.write_str("component registry is frozen"),
RegistryError::CapacityExceeded { cap } => {
write!(f, "component registry capacity exceeded (cap {cap})")
}
RegistryError::NotRegistered { type_id } => {
write!(f, "component type is not registered: {:?}", type_id)
}
RegistryError::MissingFactory { component_id } => write!(
f,
"missing component factory for component id {}",
component_id
),
RegistryError::InvalidComponentId { component_id, cap } => write!(
f,
"invalid component id {}; valid component ids are < {}",
component_id, cap
),
RegistryError::ComponentIdNotRegistered { component_id } => {
write!(f, "component id {} is not registered", component_id)
}
RegistryError::ZeroSizedComponent { type_id } => {
write!(f, "zero-sized component is not allowed: {:?}", type_id)
}
RegistryError::PoisonedLock => f.write_str("component registry lock poisoned"),
}
}
}
impl std::error::Error for RegistryError {}
pub type RegistryResult<T> = Result<T, RegistryError>;