1#[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 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 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}