zerror_full/
lib.rs

1////////////////////////////////////////////// zerror //////////////////////////////////////////////
2
3#[macro_export]
4macro_rules! zerror {
5    (@inner
6     $(#[$doc:meta])*
7     $error_name:ident
8     [$($(#[$variant1_doc:meta])* $variant1_type:ident as $variant1_ctor:ident counter $counter1_name:path
9         { $($(#[$field1_doc:meta])* $field1_name:ident : $field1_type:ty),* };)*]
10     [$($(#[$variant2_doc:meta])* $variant2_type:ident from $(#[$from2_doc:meta])* $from2_type:ty as $variant2_ctor:ident counter $counter2_name:path;)*]
11    ) => {
12        $(#[$doc])*
13        pub enum $error_name {
14            $($(#[$variant1_doc])* $variant1_type {
15                #[prototk(1, message)]
16                core: zerror_core::ErrorCore,
17                $($(#[$field1_doc])* $field1_name : $field1_type,)*
18            },)*
19            $($(#[$variant2_doc])* $variant2_type {
20                #[prototk(1, message)]
21                core: zerror_core::ErrorCore,
22                $(#[$from2_doc])* what : $from2_type,
23            },)*
24        }
25
26        impl $error_name {
27            /// Get an immutable reference to this core.
28            pub fn core(&self) -> &::zerror_core::ErrorCore {
29                match self {
30                    $($error_name ::$variant1_type { core, $($field1_name: _,)* } => { core },)*
31                    $($error_name ::$variant2_type { core, what: _ } => { core },)*
32                }
33            }
34
35            /// Get a mutable reference to this core.
36            pub fn core_mut(&mut self) -> &mut ::zerror_core::ErrorCore {
37                match self {
38                    $($error_name ::$variant1_type { core, $($field1_name: _,)* } => { core },)*
39                    $($error_name ::$variant2_type { core, what: _ } => { core },)*
40                }
41            }
42
43            $(
44            pub fn $variant1_ctor($($field1_name: impl Into<$field1_type>),*) -> Self {
45                Self::$variant1_type {
46                    core: zerror_core::ErrorCore::new(&$counter1_name),
47                    $($field1_name: $field1_name.into(),)*
48                }
49            }
50            )*
51        }
52
53        impl ::zerror::Z for $error_name {
54            type Error = Self;
55
56            fn long_form(&self) -> String {
57                format!("{}\n", self) + &self.core().long_form()
58            }
59
60            fn with_info<X: ::std::fmt::Debug>(mut self, name: &str, value: X) -> Self::Error {
61                self.core_mut().set_info(name, value);
62                self
63            }
64
65            fn with_lazy_info<F: FnOnce() -> String>(mut self, name: &str, value: F) -> Self::Error {
66                self.core_mut().set_lazy_info(name, value);
67                self
68            }
69        }
70
71        impl std::fmt::Debug for $error_name {
72            fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> Result<(), ::std::fmt::Error> {
73                match self {
74                    _ => { Ok(()) },
75                }
76            }
77        }
78
79        impl std::fmt::Display for $error_name {
80            fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> Result<(), ::std::fmt::Error> {
81                use zerror::Z;
82                write!(fmt, "{}", self.long_form())
83            }
84        }
85
86        $(
87        impl From<$from2_type> for $error_name {
88            fn from(err: $from2_type) -> Self {
89                Self::$variant2_type {
90                    core: zerror_core::ErrorCore::new(&$counter2_name),
91                    what: err,
92                }
93            }
94        }
95        )*
96    };
97    (@inner
98     $(#[$doc:meta])*
99     $error_name:ident
100     [$($(#[$variant1_doc:meta])* $variant1_type:ident as $variant1_ctor:ident counter $counter1_name:path
101         { $($(#[$field1_doc:meta])* $field1_name:ident : $field1_type:ty),* };)*]
102     [$($(#[$variant2_doc:meta])* $variant2_type:ident from $(#[$from2_doc:meta])* $from2_type:ty as $variant2_ctor:ident counter $counter2_name:path;)*]
103     $(#[$variant_doc:meta])* $variant_type:ident from $(#[$from_doc:meta])* $from_type:ty as $variant_ctor:ident counter $counter_name:path,
104     $($tt:tt)*
105    ) => {
106        zerror!(@inner
107            $(#[$doc])*
108            $error_name
109            [$($(#[$variant1_doc])* $variant1_type as $variant1_ctor counter $counter1_name
110                { $($(#[$field1_doc])* $field1_name : $field1_type),* };)*]
111            [$($(#[$variant2_doc])* $variant2_type from $(#[$from2_doc])* $from2_type as $variant2_ctor counter $counter2_name;)*
112                $(#[$variant_doc])* $variant_type from $(#[$from_doc])* $from_type as $variant_ctor counter $counter_name;]
113            $($tt)*);
114    };
115    (@inner
116     $(#[$doc:meta])*
117     $error_name:ident
118     [$($(#[$variant1_doc:meta])* $variant1_type:ident as $variant1_ctor:ident counter $counter1_name:path
119         { $($(#[$field1_doc:meta])* $field1_name:ident : $field1_type:ty),* };)*]
120     [$($(#[$variant2_doc:meta])* $variant2_type:ident from $(#[$from2_doc:meta])* $from2_type:ty as $variant2_ctor:ident counter $counter2_name:path;)*]
121     $(#[$variant_doc:meta])* $variant_type:ident from $(#[$from_doc:meta])* $from_type:ty as $variant_ctor:ident,
122     $($tt:tt)*
123    ) => {
124        zerror!(@inner
125            $(#[$doc])*
126            $error_name
127            [$($(#[$variant1_doc])* $variant1_type as $variant1_ctor counter $counter1_name
128                { $($(#[$field1_doc])* $field1_name : $field1_type),* };)*]
129            [$($(#[$variant2_doc])* $variant2_type from $(#[$from2_doc])* $from2_type as $variant2_ctor counter $counter2_name;)*
130                $(#[$variant_doc])* $variant_type from $(#[$from_doc])* $from_type as $variant_ctor counter zerror_core::DEFAULT_ERROR_CORE;]
131            $($tt)*);
132    };
133    (@inner
134     $(#[$doc:meta])*
135     $error_name:ident
136     [$($(#[$variant1_doc:meta])* $variant1_type:ident as $variant1_ctor:ident counter $counter1_name:path
137         { $($(#[$field1_doc:meta])* $field1_name:ident : $field1_type:ty),* };)*]
138     [$($(#[$variant2_doc:meta])* $variant2_type:ident from $(#[$from2_doc:meta])* $from2_type:ty
139         as $variant2_ctor:ident counter $counter2_name:path;)*]
140     $(#[$variant_doc:meta])* $variant_type:ident as $variant_ctor:ident counter $counter_name:path
141         { $($(#[$field_doc:meta])* $field_name:ident : $field_type:ty,)* },
142     $($tt:tt)*
143    ) => {
144        zerror!(@inner
145            $(#[$doc])*
146            $error_name
147            [$($(#[$variant1_doc])* $variant1_type as $variant1_ctor counter $counter1_name
148                { $($(#[$field1_doc])* $field1_name : $field1_type),* };)*
149                $(#[$variant_doc])* $variant_type as $variant_ctor counter $counter_name
150                { $($(#[$field_doc])* $field_name : $field_type),* };]
151            [$($(#[$variant2_doc])* $variant2_type from $(#[$from2_doc])* $from2_type as $variant2_ctor counter $counter2_name;)*]
152            $($tt)*);
153    };
154    (@inner
155     $(#[$doc:meta])*
156     $error_name:ident
157     [$($(#[$variant1_doc:meta])* $variant1_type:ident as $variant1_ctor:ident counter $counter1_name:path
158         { $($(#[$field1_doc:meta])* $field1_name:ident : $field1_type:ty),* };)*]
159     [$($(#[$variant2_doc:meta])* $variant2_type:ident from $(#[$from2_doc:meta])* $from2_type:ty
160         as $variant2_ctor:ident counter $counter2_name:path;)*]
161     $(#[$variant_doc:meta])* $variant_type:ident as $variant_ctor:ident
162         { $($(#[$field_doc:meta])* $field_name:ident : $field_type:ty,)* },
163     $($tt:tt)*
164    ) => {
165        zerror!(@inner
166            $(#[$doc])*
167            $error_name
168            [$($(#[$variant1_doc])* $variant1_type as $variant1_ctor counter $counter1_name
169                { $($(#[$field1_doc])* $field1_name : $field1_type),* };)*
170                $(#[$variant_doc])* $variant_type as $variant_ctor counter zerror_core::DEFAULT_ERROR_CORE
171                { $($(#[$field_doc])* $field_name : $field_type),* };]
172            [$($(#[$variant2_doc])* $variant2_type from $(#[$from2_doc])* $from2_type as $variant2_ctor counter $counter2_name;)*]
173            $($tt)*);
174    };
175    ($(#[$doc:meta])* $error_name:ident { $($tt:tt)* }) => {
176        zerror!(@inner $(#[$doc])* $error_name [] [] $($tt)*);
177    };
178}