1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#![macro_use]

#[macro_export]
macro_rules! result_define {
    ($name:ident: $module:expr, $description:expr) => {
        paste::paste! {
            pub struct [<Result $name>];

            impl $crate::result::ResultBase for [<Result $name>] {
                fn get_module() -> u32 {
                    $module
                }
                
                fn get_description() -> u32 {
                    $description
                }
            }
        }
    };
}

#[macro_export]
macro_rules! result_define_group {
    ($module:expr => { $( $name:ident: $description:expr ),* }) => {
        $( $crate::result_define!($name: $module, $description); )*
    };
}

#[macro_export]
macro_rules! result_define_subgroup {
    (
        $module:expr, $submodule:expr => {
            $( $name:ident: $description:expr ),*
        }
    ) => {
        $crate::result_define_group!($module => { $( $name: $submodule + $description ),* });
    };
}

#[macro_export]
macro_rules! result_return_if {
    ($cond_expr:expr, $res:ty) => {
        let cond = $cond_expr;
        if cond {
            return <$res>::make_err();
        }
    };

    ($cond_expr:expr, $res:literal) => {
        let cond = $cond_expr;
        if cond {
            return $crate::result::ResultCode::new_err($res);
        }
    };
}

#[macro_export]
macro_rules! result_return_unless {
    ($cond_expr:expr, $res:ty) => {
        $crate::result_return_if!(!$cond_expr, $res);
    };

    ($cond_expr:expr, $res:literal) => {
        $crate::result_return_if!(!$cond_expr, $res);
    };
}

#[macro_export]
macro_rules! result_try {
    ($rc_expr:expr) => {
        let rc = $rc_expr;
        if rc.is_failure() {
            return Err(rc);
        }
    };
}