use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum Error {
#[error("Render failed: {0}")]
Render(String),
#[error("I/O error: {0}")]
Io(String),
#[error("Chrome error: {0}")]
Chrome(String),
#[error("Image too large: {size} bytes (max {max} bytes)")]
ImageTooLarge {
size: usize,
max: usize,
},
#[error("JSON error: {0}")]
Json(String),
#[error("Config error: {0}")]
Config(String),
}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err.to_string())
}
}
impl From<serde_json::Error> for Error {
fn from(err: serde_json::Error) -> Self {
Error::Json(err.to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = Error::ImageTooLarge {
size: 100_000,
max: 90 * 1024,
};
assert!(err.to_string().contains("100000"));
assert!(err.to_string().contains("92160"));
}
#[test]
fn test_render_error() {
let err = Error::Render("Chrome crashed".to_string());
assert!(err.to_string().contains("Chrome crashed"));
}
}