Skip to main content

bee2_rs/
errors.rs

1use std::error::Error;
2
3pub trait Bee2Error: Error {}
4
5#[cfg(any(
6    feature = "bign",
7    feature = "belt",
8    feature = "block",
9    feature = "brng"
10))]
11macro_rules! error {
12    ($visibility:vis struct $name:ident { $($struct_field_name:ident: $struct_field_type:ty),* $(,)? }, Default { $($struct_init:tt),* $(,)? } $(,)?) => {
13        #[derive(Debug)]
14        #[allow(dead_code)]
15        $visibility struct $name {
16            $(
17                $visibility $struct_field_name: $struct_field_type
18            ),*
19            // $($struct_fields)*
20        }
21
22        impl $name {
23            pub fn new_box($($struct_field_name: $struct_field_type),*) -> Box<dyn Bee2Error> {
24                Box::new(Self {
25                    $($struct_init),*
26                }) as Box<dyn Bee2Error>
27            }
28        }
29
30        impl std::fmt::Display for $name {
31            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
32                std::fmt::Debug::fmt(&self, f)
33            }
34        }
35
36        impl Error for $name {}
37        impl Bee2Error for $name {}
38    };
39    ($visibility:vis struct $name:ident { $($struct_field_name:ident: $struct_field_type:ty),* } Default { $($struct_init:tt),* } enum $enum_name:ident { $($enum_field:ident $(($($enum_value:ty),*))?,)* } $(,)?) => {
40        #[derive(Debug)]
41        $visibility enum $enum_name {
42            $($enum_field $(($($enum_value),*))?),*
43        }
44        error!(
45            $visibility struct $name {
46                kind: $enum_name,
47                $($struct_field_name: $struct_field_type),*
48            }, Default {
49                kind,
50                $($struct_init),*
51            }
52        );
53    };
54}
55
56#[cfg(feature = "bign")]
57error!(
58    pub struct AnyError {
59        error: Box<dyn std::error::Error>,
60    },
61    Default { error }
62);
63#[cfg(feature = "belt")]
64error!(pub struct InvalidBlockError {}, Default {});
65#[cfg(feature = "block")]
66error!(
67    pub struct InvalidPaddingError {}
68    Default {}
69    enum InvalidPaddingErrorKind {
70        // `data`.
71        NoBlocks(Vec<Box<[u8]>>),
72        // `data`.
73        NoData(Vec<Box<[u8]>>),
74        // `data`, `last_block_byte_index`, `padding_byte`, `last_padding_byte`.
75        InvalidPaddingData(Vec<Box<[u8]>>, usize, u8, u8),
76        // `data`, `block_index`, `block_size`, `len_of_current_block`.
77        DifferentBlockSizes(Vec<Box<[u8]>>, usize, u8, u8),
78        // `data`, `expected_data_in_last_block`, `last_blocK_len`.
79        NotEnoughData(Vec<Box<[u8]>>, u8, u8),
80    }
81);
82#[cfg(feature = "bign")]
83error!(
84    pub struct BignError {
85        code: u32,
86    },
87    Default { code }
88);
89#[cfg(feature = "bash")]
90error!(
91    pub struct BashError {}
92    Default {}
93    enum BashErrorKind {
94        InvalidResistanceLevel,
95        HashLengthIsTooLarge,
96        CodeError(u32),
97    }
98);
99#[cfg(feature = "brng")]
100error!(
101    pub struct BrngError {}
102    Default {}
103    enum BrngErrorKind {
104        CodeError(u32),
105    }
106);
107#[cfg(feature = "belt")]
108error!(
109    pub struct BeltError {}
110    Default {}
111    enum BeltErrorKind {
112        CodeError(u32),
113    }
114);
115
116pub type Result<T> = core::result::Result<T, Box<dyn Bee2Error>>;
117pub type Bee2Result<T> = Result<T>;