use thiserror::Error;
pub type Result<T> = core::result::Result<T, CliError>;
#[derive(Debug, Error)]
pub enum CliError {
#[error(transparent)]
Conversion(#[from] docspec_core::Error),
#[error("{message}")]
FormatDetection {
message: String,
},
#[deprecated(
since = "1.0.3",
note = "use `ReaderNotImplemented` or `WriterNotImplemented` for direction-correct error messages"
)]
#[error("{format} reader not yet implemented")]
FormatNotSupported {
format: String,
},
#[error(transparent)]
Io(#[from] std::io::Error),
#[error("{format} reader not yet implemented")]
ReaderNotImplemented {
format: String,
},
#[error("input and output paths refer to the same file")]
SameInputOutput,
#[error("{format} writer not yet implemented")]
WriterNotImplemented {
format: String,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn display_conversion_error() {
let inner = docspec_core::Error::Other {
message: "pipeline failed".to_string(),
};
let err = CliError::Conversion(inner);
assert!(err.to_string().contains("pipeline failed"));
}
#[test]
fn display_format_detection_error() {
let err = CliError::FormatDetection {
message: "cannot detect format".to_string(),
};
assert_eq!(err.to_string(), "cannot detect format");
}
#[allow(deprecated)]
#[test]
fn display_format_not_supported_error() {
let err = CliError::FormatNotSupported {
format: "blocknote".to_string(),
};
assert_eq!(err.to_string(), "blocknote reader not yet implemented");
}
#[test]
fn display_reader_not_implemented_error() {
let err = CliError::ReaderNotImplemented {
format: "blocknote".to_string(),
};
assert_eq!(err.to_string(), "blocknote reader not yet implemented");
}
#[test]
fn display_writer_not_implemented_error() {
let err = CliError::WriterNotImplemented {
format: "markdown".to_string(),
};
assert_eq!(err.to_string(), "markdown writer not yet implemented");
}
#[test]
fn display_io_error() {
let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
let err = CliError::Io(io_err);
assert!(err.to_string().contains("file not found"));
}
#[test]
fn display_same_input_output() {
let err = CliError::SameInputOutput;
assert!(err.to_string().contains("same file"));
}
#[test]
fn from_docspec_error() {
let inner = docspec_core::Error::Other {
message: "test".to_string(),
};
let err = CliError::from(inner);
assert!(matches!(err, CliError::Conversion(_)));
}
#[test]
fn from_io_error() {
let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "test");
let err = CliError::from(io_err);
assert!(matches!(err, CliError::Io(_)));
}
}