use std::path::Path;
use thiserror::Error;
#[derive(Error, Debug)]
pub enum CueEngineError {
#[error("Configuration error: {message}")]
Configuration {
message: String,
},
#[error("FFI operation failed in {function}: {message}")]
Ffi {
function: &'static str,
message: String,
},
#[error("CUE parsing failed at {}: {message}", path.display())]
CueParse {
path: Box<Path>,
message: String,
},
#[error("Validation failed: {message}")]
Validation {
message: String,
},
#[error("Cache error: {message}")]
Cache {
message: String,
},
}
impl CueEngineError {
#[must_use]
pub fn configuration(message: impl Into<String>) -> Self {
Self::Configuration {
message: message.into(),
}
}
#[must_use]
pub fn ffi(function: &'static str, message: impl Into<String>) -> Self {
Self::Ffi {
function,
message: message.into(),
}
}
#[must_use]
pub fn cue_parse(path: &Path, message: impl Into<String>) -> Self {
Self::CueParse {
path: path.into(),
message: message.into(),
}
}
#[must_use]
pub fn validation(message: impl Into<String>) -> Self {
Self::Validation {
message: message.into(),
}
}
#[must_use]
pub fn cache(message: impl Into<String>) -> Self {
Self::Cache {
message: message.into(),
}
}
}
pub type Result<T> = std::result::Result<T, CueEngineError>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_configuration_error() {
let err = CueEngineError::configuration("invalid setting");
assert!(err.to_string().contains("Configuration error"));
assert!(err.to_string().contains("invalid setting"));
}
#[test]
fn test_ffi_error() {
let err = CueEngineError::ffi("cue_eval_package", "null pointer");
assert!(err.to_string().contains("FFI operation failed"));
assert!(err.to_string().contains("cue_eval_package"));
assert!(err.to_string().contains("null pointer"));
}
#[test]
fn test_cue_parse_error() {
let path = Path::new("/some/path");
let err = CueEngineError::cue_parse(path, "syntax error");
assert!(err.to_string().contains("CUE parsing failed"));
assert!(err.to_string().contains("/some/path"));
assert!(err.to_string().contains("syntax error"));
}
#[test]
fn test_validation_error() {
let err = CueEngineError::validation("path too long");
assert!(err.to_string().contains("Validation failed"));
assert!(err.to_string().contains("path too long"));
}
#[test]
fn test_cache_error() {
let err = CueEngineError::cache("capacity must be non-zero");
assert!(err.to_string().contains("Cache error"));
assert!(err.to_string().contains("capacity must be non-zero"));
}
#[test]
fn test_error_is_send_sync() {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<CueEngineError>();
}
}