use thiserror::Error;
#[derive(Error, Debug)]
pub enum TcmError {
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("Invalid format: {message}")]
InvalidFormat { message: String },
#[error("Unsupported format version: {version}")]
UnsupportedVersion { version: u8 },
#[error("Invalid input: {message}")]
InvalidInput { message: String },
#[error("Invalid button value: {value} (expected 1-3)")]
InvalidButton { value: u8 },
#[error("Invalid restart type: {value} (expected 0-2)")]
InvalidRestartType { value: u8 },
#[error("Invalid metadata: {message}")]
InvalidMetadata { message: String },
#[error("Invalid file header - not a valid TCM file")]
InvalidHeader,
#[error("Unexpected end of file while reading {context}")]
UnexpectedEof { context: String },
#[error("Serialization error: {message}")]
SerializationError { message: String },
#[error("Deserialization error: {message}")]
DeserializationError { message: String },
}
pub type TcmResult<T> = Result<T, TcmError>;
impl TcmError {
pub fn invalid_format(message: impl Into<String>) -> Self {
Self::InvalidFormat {
message: message.into(),
}
}
pub fn invalid_input(message: impl Into<String>) -> Self {
Self::InvalidInput {
message: message.into(),
}
}
pub fn invalid_metadata(message: impl Into<String>) -> Self {
Self::InvalidMetadata {
message: message.into(),
}
}
pub fn unexpected_eof(context: impl Into<String>) -> Self {
Self::UnexpectedEof {
context: context.into(),
}
}
pub fn serialization_error(message: impl Into<String>) -> Self {
Self::SerializationError {
message: message.into(),
}
}
pub fn deserialization_error(message: impl Into<String>) -> Self {
Self::DeserializationError {
message: message.into(),
}
}
}