use super::PluginEffectBatchLimitField;
use crate::plugin::PluginIdentity;
use std::{
fmt::{Debug, Display, Formatter},
num::NonZeroUsize,
};
#[derive(Clone, Copy, Eq, PartialEq)]
pub enum PluginEffectCommitErrorKind {
ZeroLimit,
TooManyEffects,
}
impl PluginEffectCommitErrorKind {
#[must_use]
pub const fn as_str(self) -> &'static str {
match self {
Self::ZeroLimit => "zero-limit",
Self::TooManyEffects => "too-many-effects",
}
}
}
impl Display for PluginEffectCommitErrorKind {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
impl Debug for PluginEffectCommitErrorKind {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
formatter.write_str(self.as_str())
}
}
#[derive(Clone, Debug, Eq, PartialEq, thiserror::Error)]
#[non_exhaustive]
pub enum PluginEffectCommitError {
ZeroLimit {
field: PluginEffectBatchLimitField,
},
TooManyEffects {
identity: PluginIdentity,
limit: NonZeroUsize,
},
}
impl PluginEffectCommitError {
#[must_use]
pub const fn kind(&self) -> PluginEffectCommitErrorKind {
match self {
Self::ZeroLimit { .. } => PluginEffectCommitErrorKind::ZeroLimit,
Self::TooManyEffects { .. } => PluginEffectCommitErrorKind::TooManyEffects,
}
}
}
impl Display for PluginEffectCommitError {
fn fmt(&self, formatter: &mut Formatter<'_>) -> std::fmt::Result {
match self {
Self::ZeroLimit { .. } => formatter.write_str("plugin effect limit must be non-zero"),
Self::TooManyEffects { identity, limit } => {
let identity = identity.as_str();
let limit = limit.get();
write!(
formatter,
"plugin {identity:?} exceeded effect limit of {limit}"
)
}
}
}
}