1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, BedrockWorldError>;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
13#[non_exhaustive]
14pub enum BedrockWorldErrorKind {
15 Io,
17 Nbt,
19 LevelDb,
21 InvalidKey,
23 UnsupportedChunkFormat,
25 Validation,
27 ReadOnly,
29 Cancelled,
31 ConcurrentWrite,
33 CorruptWorld,
35 Join,
37}
38
39#[non_exhaustive]
41#[derive(Debug, Error)]
42pub enum BedrockWorldError {
43 #[error("I/O error: {0}")]
45 Io(#[from] std::io::Error),
46 #[error("NBT error: {0}")]
48 Nbt(String),
49 #[error("LevelDB error: {0}")]
51 LevelDb(String),
52 #[error("invalid Bedrock key: {0}")]
54 InvalidKey(String),
55 #[error("unsupported chunk format: {0}")]
57 UnsupportedChunkFormat(String),
58 #[error("validation failed: {0}")]
60 Validation(String),
61 #[error("world is read-only")]
63 ReadOnly,
64 #[error("{operation} was cancelled")]
66 Cancelled {
67 operation: &'static str,
69 },
70 #[error("concurrent write rejected: {0}")]
72 ConcurrentWrite(String),
73 #[error("corrupt world: {0}")]
75 CorruptWorld(String),
76 #[error("async runtime error: {0}")]
78 Join(String),
79}
80
81impl BedrockWorldError {
82 #[must_use]
84 pub const fn kind(&self) -> BedrockWorldErrorKind {
85 match self {
86 Self::Io(_) => BedrockWorldErrorKind::Io,
87 Self::Nbt(_) => BedrockWorldErrorKind::Nbt,
88 Self::LevelDb(_) => BedrockWorldErrorKind::LevelDb,
89 Self::InvalidKey(_) => BedrockWorldErrorKind::InvalidKey,
90 Self::UnsupportedChunkFormat(_) => BedrockWorldErrorKind::UnsupportedChunkFormat,
91 Self::Validation(_) => BedrockWorldErrorKind::Validation,
92 Self::ReadOnly => BedrockWorldErrorKind::ReadOnly,
93 Self::Cancelled { .. } => BedrockWorldErrorKind::Cancelled,
94 Self::ConcurrentWrite(_) => BedrockWorldErrorKind::ConcurrentWrite,
95 Self::CorruptWorld(_) => BedrockWorldErrorKind::CorruptWorld,
96 Self::Join(_) => BedrockWorldErrorKind::Join,
97 }
98 }
99}
100
101impl From<std::string::FromUtf8Error> for BedrockWorldError {
102 fn from(error: std::string::FromUtf8Error) -> Self {
103 Self::Nbt(error.to_string())
104 }
105}
106
107impl From<std::str::Utf8Error> for BedrockWorldError {
108 fn from(error: std::str::Utf8Error) -> Self {
109 Self::Nbt(error.to_string())
110 }
111}