use crate::engine::error::ECSError;
use crate::engine::types::ChannelID;
#[derive(Debug, thiserror::Error)]
pub enum ModelError {
#[error(transparent)]
Ecs(#[from] ECSError),
#[error(transparent)]
Agent(#[from] crate::agents::AgentError),
#[error(
"agent template `{template}` was given columns of differing lengths: expected {expected}, found {found}"
)]
AgentPopulationLengthMismatch {
template: String,
expected: usize,
found: usize,
},
#[cfg(feature = "messaging")]
#[error(transparent)]
Messaging(#[from] crate::messaging::MessagingError),
#[error(transparent)]
Environment(#[from] crate::environment::EnvironmentError),
#[error(transparent)]
Spawn(#[from] crate::engine::error::SpawnError),
#[error(
"message channel {channel_id} crosses scheduler boundary from {producer_scope} to {consumer_scope}"
)]
CrossSchedulerMessageChannel {
channel_id: ChannelID,
producer_scope: String,
consumer_scope: String,
},
#[error(
"environment channel {channel_id} flows backward from {producer_scope} to {consumer_scope}"
)]
BackwardEnvironmentChannel {
channel_id: ChannelID,
producer_scope: String,
consumer_scope: String,
},
#[error("duplicate sub-scheduler name: {name}")]
DuplicateSubSchedulerName {
name: String,
},
#[error("model build lock poisoned: {0}")]
LockPoisoned(&'static str),
}