use std::io;
use thiserror::Error;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Error, Debug)]
pub enum Error {
#[error("I/O error: {0}")]
Io(#[from] io::Error),
#[error("Unknown file format")]
UnknownFormat,
#[error("Unsupported format: {0}")]
UnsupportedFormat(String),
#[error("Document is encrypted")]
Encrypted,
#[error("Document is a restricted distribution document")]
DistributionRestricted,
#[error("OLE container error: {0}")]
OleContainer(String),
#[error("ZIP archive error: {0}")]
ZipArchive(String),
#[error("Decompression error: {0}")]
Decompression(String),
#[error("Record parsing error at offset {offset}: {message}")]
RecordParse { offset: u64, message: String },
#[error("XML parsing error: {0}")]
XmlParse(String),
#[error("Invalid data: {0}")]
InvalidData(String),
#[error("Missing required component: {0}")]
MissingComponent(String),
#[error("Text encoding error: {0}")]
Encoding(String),
#[error("Style reference not found: {0}")]
StyleNotFound(u32),
#[error("Resource not found: {0}")]
ResourceNotFound(String),
}
impl From<zip::result::ZipError> for Error {
fn from(err: zip::result::ZipError) -> Self {
Error::ZipArchive(err.to_string())
}
}
impl From<quick_xml::Error> for Error {
fn from(err: quick_xml::Error) -> Self {
Error::XmlParse(err.to_string())
}
}
impl From<std::string::FromUtf16Error> for Error {
fn from(err: std::string::FromUtf16Error) -> Self {
Error::Encoding(err.to_string())
}
}
impl From<std::str::Utf8Error> for Error {
fn from(err: std::str::Utf8Error) -> Self {
Error::Encoding(err.to_string())
}
}