use thiserror::Error;
pub type Result<T> = std::result::Result<T, BedrockWorldError>;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum BedrockWorldErrorKind {
Io,
Nbt,
LevelDb,
InvalidKey,
UnsupportedChunkFormat,
Validation,
ReadOnly,
Cancelled,
ConcurrentWrite,
CorruptWorld,
Join,
}
#[non_exhaustive]
#[derive(Debug, Error)]
pub enum BedrockWorldError {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("NBT error: {0}")]
Nbt(String),
#[error("LevelDB error: {0}")]
LevelDb(String),
#[error("invalid Bedrock key: {0}")]
InvalidKey(String),
#[error("unsupported chunk format: {0}")]
UnsupportedChunkFormat(String),
#[error("validation failed: {0}")]
Validation(String),
#[error("world is read-only")]
ReadOnly,
#[error("{operation} was cancelled")]
Cancelled {
operation: &'static str,
},
#[error("concurrent write rejected: {0}")]
ConcurrentWrite(String),
#[error("corrupt world: {0}")]
CorruptWorld(String),
#[error("async runtime error: {0}")]
Join(String),
}
impl BedrockWorldError {
#[must_use]
pub const fn kind(&self) -> BedrockWorldErrorKind {
match self {
Self::Io(_) => BedrockWorldErrorKind::Io,
Self::Nbt(_) => BedrockWorldErrorKind::Nbt,
Self::LevelDb(_) => BedrockWorldErrorKind::LevelDb,
Self::InvalidKey(_) => BedrockWorldErrorKind::InvalidKey,
Self::UnsupportedChunkFormat(_) => BedrockWorldErrorKind::UnsupportedChunkFormat,
Self::Validation(_) => BedrockWorldErrorKind::Validation,
Self::ReadOnly => BedrockWorldErrorKind::ReadOnly,
Self::Cancelled { .. } => BedrockWorldErrorKind::Cancelled,
Self::ConcurrentWrite(_) => BedrockWorldErrorKind::ConcurrentWrite,
Self::CorruptWorld(_) => BedrockWorldErrorKind::CorruptWorld,
Self::Join(_) => BedrockWorldErrorKind::Join,
}
}
}
impl From<std::string::FromUtf8Error> for BedrockWorldError {
fn from(error: std::string::FromUtf8Error) -> Self {
Self::Nbt(error.to_string())
}
}
impl From<std::str::Utf8Error> for BedrockWorldError {
fn from(error: std::str::Utf8Error) -> Self {
Self::Nbt(error.to_string())
}
}