1use std::sync::Arc;
2
3use gufo_common::math::MathError;
4
5use crate::internal::{Ifd, TagIfd, Type};
6
7pub type Result<T> = std::result::Result<T, Error>;
8
9#[derive(Debug, Clone, thiserror::Error)]
10#[non_exhaustive]
11pub enum Error {
12 #[error("Unkown byte order: {0:x?}")]
13 UnkownByteOrder([u8; 2]),
14 #[error("Wrong magic bytes: {0:x?}")]
15 MagicBytesWrong(u16),
16 #[error("IO error: {0}")]
17 Io(Arc<std::io::Error>),
18 #[error("Tag not found: {0:?}")]
19 TagNotFound(TagIfd),
20 #[error("Ifd should terminate: {0:?}")]
21 IfdShouldTerminate(Ifd),
22 #[error("OffsetTooLarge")]
23 OffsetTooLarge,
24 #[error("LookupEof")]
25 LookupEof,
26 #[error("LookupEof")]
27 ByteOrderEof,
28 #[error("ByteOrderEof")]
29 MagicBytesEof,
30 #[error("MagicBytesEof")]
31 EntryEof,
32 #[error("IfdNumEntriesEof")]
33 IfdNumEntriesEof,
34 #[error("NumerEntriesEof")]
35 InvalidLookupOffset,
36 #[error("InvalidLookupOffset")]
37 DataSizeTooLarge,
38 #[error("DataSizeTooLarge")]
39 IfdNotFound,
40 #[error("IfdNotFound")]
41 WrongTypeGeneric,
42 #[error("WrongTypeGeneric")]
43 WrongType {
44 expected: (u32, Type),
45 actual: (u32, Type),
46 },
47 #[error("OffsetInvalid: {0}")]
48 OffsetInvalid(i64),
49 #[error("OffsetInsteadOfValue")]
50 OffsetInsteadOfValue,
51 #[error("ValueInsteadOfOffset")]
52 ValueInsteadOfOffset,
53 #[error("IncompatibleValue")]
54 IncompatibleValue,
55 #[error("AdditionOverflow")]
56 AdditionOverflow,
57 #[error("SubstractionOverflowError")]
58 SubstractionOverflowError,
59 #[error("ConversionOverflowError")]
60 ConversionOverflowError,
61 #[error("EntryNotFound")]
62 EntryNotFound,
63 #[error("Math operation error: {0}")]
64 Math(#[from] MathError),
65}
66
67impl From<std::io::Error> for Error {
68 fn from(value: std::io::Error) -> Self {
69 Self::Io(Arc::new(value))
70 }
71}
72
73pub(crate) trait ResultExt<T> {
74 fn e(self, err: Error) -> Result<T>;
75}
76
77impl<T, E> ResultExt<T> for std::result::Result<T, E> {
78 fn e(self, err: Error) -> Result<T> {
79 self.map_err(|_| err)
80 }
81}
82
83impl<T> ResultExt<T> for Option<T> {
84 fn e(self, err: Error) -> Result<T> {
85 match self {
86 Some(v) => Ok(v),
87 None => Err(err),
88 }
89 }
90}