1use std::io;
2use std::sync::Arc;
3
4#[derive(Debug, Clone)]
5pub enum AsmErr {
6 OutOfRange(usize),
10 IOReadErr(Arc<io::Error>),
12 IOWriteErr(Arc<io::Error>),
14 IllegalFormat(String),
16 ReadUTF8(String),
18 ResolveNode(String),
20 UnknownInsn(u8),
22 InvalidLEB128(usize),
24 UnknownDexPayload(u8),
26}
27
28impl AsmErr {
29 pub fn e<T>(self) -> AsmResult<T> {
30 Err(self)
31 }
32
33 pub fn loge(self) {
34 eprintln!("{:?}", self);
35 }
36}
37
38pub type AsmResult<T> = Result<T, AsmErr>;
39
40pub(crate) trait AsmResultOkExt<T> {
41 fn ok(self) -> AsmResult<T>;
42}
43
44pub(crate) trait AsmResultExt<T> {
45 fn ok_or_error(self, when_none: impl FnOnce() -> AsmResult<T>) -> AsmResult<T>;
46}
47
48impl<T> AsmResultOkExt<T> for T {
49 #[inline]
50 fn ok(self) -> AsmResult<T> {
51 Ok(self)
52 }
53}
54
55impl<T> AsmResultExt<T> for Option<T> {
56 #[inline]
57 fn ok_or_error(self, when_none: impl FnOnce() -> AsmResult<T>) -> AsmResult<T> {
58 match self {
59 Some(v) => Ok(v),
60 None => when_none(),
61 }
62 }
63}