#![cfg(feature = "alloc")]
use core::convert::Infallible;
use core::error::Error;
use core::fmt::{self, Display, Formatter};
#[derive(Debug)]
pub struct BuildError<'a>(Inner<'a>);
impl<'a> BuildError<'a> {
#[inline]
#[must_use]
pub(in crate::wad) fn large_size(value: usize) -> Self {
let inner = Inner::LargeSize { value };
Self(inner)
}
#[inline]
#[must_use]
pub(in crate::wad) fn long_lump_name(name: &'a str) -> Self {
let inner = Inner::LongLumpName { name };
Self(inner)
}
#[inline]
#[must_use]
pub(in crate::wad) fn null_lump_name(name: &'a str) -> Self {
let inner = Inner::NullLumpName { name };
Self(inner)
}
}
impl Display for BuildError<'_> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self.0 {
Inner::LargeSize { value } => {
write!(f, "size value `{value}` may not be greater than `{}`", i32::MAX)?;
}
Inner::LongLumpName { name } => {
write!(f, "lump name `{}` may not be longer than `8` character", name.escape_default())?;
}
Inner::NullLumpName { name } => {
write!(f, "lump name `{}` may not contain null characters", name.escape_default())?;
}
}
Ok(())
}
}
impl Error for BuildError<'static> {}
impl From<Infallible> for BuildError<'_> {
fn from(value: Infallible) -> Self {
match value {}
}
}
#[non_exhaustive]
#[derive(Clone, Debug)]
enum Inner<'a> {
LargeSize {
value: usize,
},
LongLumpName {
name: &'a str,
},
NullLumpName {
name: &'a str,
},
}