use thiserror::Error;
#[derive(Debug, Error)]
pub enum VmSpectError {
#[error("Error de E/S: {0}")]
Io(#[from] std::io::Error),
#[error("Error de parseo: {0}")]
Parse(String),
#[error("Sistema operativo no soportado: {0}")]
UnsupportedOs(String),
#[error("Formato de imagen no soportado: {0}")]
UnsupportedFormat(String),
#[error("Imagen de disco no encontrada: {0}")]
ImageNotFound(String),
#[error("La inspección fue cancelada por el usuario")]
Cancelled,
#[error("Herramienta QEMU no disponible: {0}")]
QemuNotFound(String),
#[error("Error de protocolo NBD: {0}")]
Nbd(String),
#[error("Error de sistema de archivos: {0}")]
FileSystem(String),
#[error("Error en el Registro de Windows: {0}")]
WindowsRegistry(String),
#[error("Error de configuración: {0}")]
Config(String),
#[error("Error de inspección: {0}")]
Other(String),
}
impl From<String> for VmSpectError {
fn from(msg: String) -> Self {
VmSpectError::Other(msg)
}
}
impl From<&str> for VmSpectError {
fn from(msg: &str) -> Self {
VmSpectError::Other(msg.to_string())
}
}
pub type Result<T> = std::result::Result<T, VmSpectError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err_io = VmSpectError::Io(std::io::Error::new(
std::io::ErrorKind::NotFound,
"archivo no encontrado",
));
assert!(err_io.to_string().contains("Error de E/S"));
let err_cancel = VmSpectError::Cancelled;
assert_eq!(
err_cancel.to_string(),
"La inspección fue cancelada por el usuario"
);
let err_other: VmSpectError = "algo falló".into();
assert_eq!(err_other.to_string(), "Error de inspección: algo falló");
}
}