fat_macho/
error.rs

1use std::{error, fmt, io};
2
3#[derive(Debug)]
4pub enum Error {
5    Io(io::Error),
6    Goblin(goblin::error::Error),
7    NotFatBinary,
8    InvalidMachO(String),
9    DuplicatedArch(String),
10    #[cfg(feature = "bitcode")]
11    Bitcode(llvm_bitcode::read::Error),
12}
13
14impl fmt::Display for Error {
15    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
16        match self {
17            Error::Io(err) => err.fmt(f),
18            Error::Goblin(err) => err.fmt(f),
19            Error::NotFatBinary => write!(f, "input is not a valid Mach-O fat binary"),
20            Error::InvalidMachO(err) => write!(f, "{}", err),
21            Error::DuplicatedArch(arch) => write!(f, "duplicated architecture {}", arch),
22            #[cfg(feature = "bitcode")]
23            Error::Bitcode(err) => err.fmt(f),
24        }
25    }
26}
27
28impl error::Error for Error {
29    fn source(&self) -> Option<&(dyn error::Error + 'static)> {
30        match self {
31            Error::Io(err) => Some(err),
32            Error::Goblin(err) => Some(err),
33            Error::NotFatBinary => None,
34            Error::InvalidMachO(_) => None,
35            Error::DuplicatedArch(_) => None,
36            #[cfg(feature = "bitcode")]
37            Error::Bitcode(err) => Some(err),
38        }
39    }
40}
41
42impl From<io::Error> for Error {
43    fn from(err: io::Error) -> Self {
44        Self::Io(err)
45    }
46}
47
48impl From<goblin::error::Error> for Error {
49    fn from(err: goblin::error::Error) -> Self {
50        Self::Goblin(err)
51    }
52}
53
54#[cfg(feature = "bitcode")]
55impl From<llvm_bitcode::read::Error> for Error {
56    fn from(err: llvm_bitcode::read::Error) -> Self {
57        Self::Bitcode(err)
58    }
59}