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}