java_asm/
err.rs

1use std::io;
2use std::sync::Arc;
3
4#[derive(Debug, Clone)]
5pub enum AsmErr {
6    // something wrong when trying to access invalid index.
7    // e.g. `constant_pool_count` declared it is 3, but `constant_pool` has only 2 elements.
8    // e.g. `this_class` declared it is 3, but `constant_pool` has only 2 elements.
9    OutOfRange(usize),
10    // io error while reading content.
11    IOReadErr(Arc<io::Error>),
12    // io error while writing content.
13    IOWriteErr(Arc<io::Error>),
14    // illegal format with custom messages.
15    IllegalFormat(String),
16    // illegal utf8 format when reading an utf8 character from the constant pool.
17    ReadUTF8(String),
18    // illegal format when resolve jvms file into a node file.
19    ResolveNode(String),
20    // unknown instruction.
21    UnknownInsn(u8),
22    // invalid leb128 format for dex at specific offset.
23    InvalidLEB128(usize),
24    // unknown dex payload format.
25    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}