use thiserror::Error;
#[derive(Error, Debug)]
pub enum CudaRustError {
#[error("Parser error: {0}")]
ParseError(String),
#[error("Translation error: {0}")]
TranslationError(String),
#[error("Runtime error: {0}")]
RuntimeError(String),
#[error("Memory error: {0}")]
MemoryError(String),
#[error("Backend error: {0}")]
Backend(String),
#[error("Kernel compilation error: {0}")]
KernelError(String),
#[error("Device error: {0}")]
DeviceError(String),
#[error("Invalid argument: {0}")]
InvalidArgument(String),
#[error("Not implemented: {0}")]
NotImplemented(String),
#[cfg(feature = "webgpu-only")]
#[error("WebGPU error: {0}")]
WebGPUError(String),
#[error("IO error: {0}")]
IoError(#[from] std::io::Error),
}
pub type Result<T> = std::result::Result<T, CudaRustError>;
#[macro_export]
macro_rules! parse_error {
($msg:expr) => {
$crate::error::CudaRustError::ParseError($msg.to_string())
};
($fmt:expr, $($arg:tt)*) => {
$crate::error::CudaRustError::ParseError(format!($fmt, $($arg)*))
};
}
#[macro_export]
macro_rules! translation_error {
($msg:expr) => {
$crate::error::CudaRustError::TranslationError($msg.to_string())
};
($fmt:expr, $($arg:tt)*) => {
$crate::error::CudaRustError::TranslationError(format!($fmt, $($arg)*))
};
}
#[macro_export]
macro_rules! runtime_error {
($msg:expr) => {
$crate::error::CudaRustError::RuntimeError($msg.to_string())
};
($fmt:expr, $($arg:tt)*) => {
$crate::error::CudaRustError::RuntimeError(format!($fmt, $($arg)*))
};
}
#[macro_export]
macro_rules! memory_error {
($msg:expr) => {
$crate::error::CudaRustError::MemoryError($msg.to_string())
};
($fmt:expr, $($arg:tt)*) => {
$crate::error::CudaRustError::MemoryError(format!($fmt, $($arg)*))
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = CudaRustError::ParseError("Invalid syntax".to_string());
assert_eq!(err.to_string(), "Parser error: Invalid syntax");
}
#[test]
fn test_error_macros() {
let err = parse_error!("test error");
assert!(matches!(err, CudaRustError::ParseError(_)));
let err = parse_error!("error: {}", 42);
assert_eq!(err.to_string(), "Parser error: error: 42");
}
}