1use j2k::J2kError;
4use j2k_core::{BackendRequest, BufferError, CodecError};
5
6#[derive(Debug, thiserror::Error)]
8#[non_exhaustive]
9pub enum Error {
10 #[error(transparent)]
12 Decode(#[from] J2kError),
13 #[error(transparent)]
15 Buffer(#[from] BufferError),
16 #[error("backend request {request:?} is not supported by j2k-cuda")]
18 UnsupportedBackend {
19 request: BackendRequest,
21 },
22 #[error("unsupported CUDA request: {reason}")]
24 UnsupportedCudaRequest {
25 reason: &'static str,
27 },
28 #[error("CUDA is unavailable on this host")]
30 CudaUnavailable,
31 #[cfg(feature = "cuda-runtime")]
32 #[error("CUDA runtime error: {message}")]
34 CudaRuntime {
35 message: String,
37 },
38}
39
40impl CodecError for Error {
41 fn is_truncated(&self) -> bool {
42 matches!(self, Self::Decode(inner) if inner.is_truncated())
43 }
44
45 fn is_not_implemented(&self) -> bool {
46 matches!(self, Self::Decode(inner) if inner.is_not_implemented())
47 }
48
49 fn is_unsupported(&self) -> bool {
50 matches!(
51 self,
52 Self::UnsupportedBackend { .. }
53 | Self::UnsupportedCudaRequest { .. }
54 | Self::CudaUnavailable
55 ) || matches!(self, Self::Decode(inner) if inner.is_unsupported())
56 }
57
58 fn is_buffer_error(&self) -> bool {
59 matches!(self, Self::Buffer(_))
60 || matches!(self, Self::Decode(inner) if inner.is_buffer_error())
61 }
62}