use thiserror::Error;
#[derive(Error, Debug)]
pub enum MemvidError {
#[error("Text processing error: {0}")]
TextProcessing(String),
#[error("QR code error: {0}")]
QrCode(String),
#[error("Video processing error: {0}")]
Video(String),
#[error("ML model error: {0}")]
MachineLearning(String),
#[error("Search error: {0}")]
Search(String),
#[error("Storage error: {0}")]
Storage(String),
#[error("PDF processing error: {0}")]
Pdf(String),
#[error("Configuration error: {0}")]
Config(String),
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[error("Database error: {0}")]
Database(#[from] rusqlite::Error),
#[error("Candle ML error: {0}")]
Candle(#[from] candle_core::Error),
#[error("Image processing error: {0}")]
Image(String),
#[error("Generic error: {0}")]
Generic(String),
}
pub type Result<T> = std::result::Result<T, MemvidError>;
impl From<image::ImageError> for MemvidError {
fn from(err: image::ImageError) -> Self {
MemvidError::Image(err.to_string())
}
}
impl From<qrcode::types::QrError> for MemvidError {
fn from(err: qrcode::types::QrError) -> Self {
MemvidError::QrCode(err.to_string())
}
}
impl From<anyhow::Error> for MemvidError {
fn from(err: anyhow::Error) -> Self {
MemvidError::Generic(err.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let error = MemvidError::TextProcessing("test error".to_string());
assert_eq!(error.to_string(), "Text processing error: test error");
}
#[test]
fn test_error_chain() {
let io_error = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
let memvid_error = MemvidError::from(io_error);
match memvid_error {
MemvidError::Io(_) => (),
_ => panic!("Expected Io error"),
}
}
}