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 }
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 NoBlocks(Vec<Box<[u8]>>),
72 NoData(Vec<Box<[u8]>>),
74 InvalidPaddingData(Vec<Box<[u8]>>, usize, u8, u8),
76 DifferentBlockSizes(Vec<Box<[u8]>>, usize, u8, u8),
78 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>;