Skip to main content

gufo_exif/
error.rs

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}