use snafu::Snafu;
pub type Result<T, E = Error> = std::result::Result<T, E>;
#[derive(Debug, Snafu)]
#[snafu(visibility(pub))]
pub enum Error {
#[snafu(display("shape mismatch: expected {expected:?}, got {actual:?}"))]
ShapeMismatch { expected: Vec<usize>, actual: Vec<usize> },
#[snafu(display("size mismatch: expected {expected}, got {actual}"))]
SizeMismatch { expected: usize, actual: usize },
#[snafu(display("copy operation failed: {reason}"))]
CopyFailed { reason: String },
#[snafu(display("invalid device: {device}"))]
InvalidDevice { device: String },
#[snafu(display("buffer not allocated"))]
NotAllocated,
#[snafu(display("buffer is not CPU-accessible (device buffers require copyout)"))]
NotCpuAccessible,
#[snafu(display("type mismatch: buffer has {actual:?}, requested {expected:?}"))]
TypeMismatch { expected: morok_dtype::DType, actual: morok_dtype::DType },
#[snafu(display("ndarray shape error: {source}"))]
NdarrayShape { source: ndarray::ShapeError },
#[snafu(display("invalid view: offset {offset} + size {size} exceeds buffer size {buffer_size}"))]
InvalidView { offset: usize, size: usize, buffer_size: usize },
#[snafu(display("runtime error: {message}"))]
Runtime { message: String },
#[cfg(feature = "cuda")]
#[snafu(display("CUDA error: {source}"))]
CudaError { source: cudarc::driver::DriverError },
}