264
264
/// Main macro that does all the work
265
265
#[ macro_export]
266
266
macro_rules! quick_error {
267
+
267
268
( $( #[ $meta: meta] ) *
268
269
pub enum $name: ident { $( $chunks: tt) * }
269
270
) => {
@@ -278,6 +279,74 @@ macro_rules! quick_error {
278
279
items [ ] buf [ ]
279
280
queue [ $( $chunks) * ] ) ;
280
281
} ;
282
+
283
+ ( $( #[ $meta: meta] ) *
284
+ pub enum $name: ident wraps $enum_name: ident { $( $chunks: tt) * }
285
+ ) => {
286
+ quick_error!( WRAPPER $enum_name [ pub struct ] $name $( #[ $meta] ) * ) ;
287
+ quick_error!( SORT [ enum $enum_name $( #[ $meta] ) * ]
288
+ items [ ] buf [ ]
289
+ queue [ $( $chunks) * ] ) ;
290
+ } ;
291
+
292
+ ( $( #[ $meta: meta] ) *
293
+ pub enum $name: ident wraps pub $enum_name: ident { $( $chunks: tt) * }
294
+ ) => {
295
+ quick_error!( WRAPPER $enum_name [ pub struct ] $name $( #[ $meta] ) * ) ;
296
+ quick_error!( SORT [ pub enum $enum_name $( #[ $meta] ) * ]
297
+ items [ ] buf [ ]
298
+ queue [ $( $chunks) * ] ) ;
299
+ } ;
300
+ ( $( #[ $meta: meta] ) *
301
+ enum $name: ident wraps $enum_name: ident { $( $chunks: tt) * }
302
+ ) => {
303
+ quick_error!( WRAPPER $enum_name [ struct ] $name $( #[ $meta] ) * ) ;
304
+ quick_error!( SORT [ enum $enum_name $( #[ $meta] ) * ]
305
+ items [ ] buf [ ]
306
+ queue [ $( $chunks) * ] ) ;
307
+ } ;
308
+
309
+ ( $( #[ $meta: meta] ) *
310
+ enum $name: ident wraps pub $enum_name: ident { $( $chunks: tt) * }
311
+ ) => {
312
+ quick_error!( WRAPPER $enum_name [ struct ] $name $( #[ $meta] ) * ) ;
313
+ quick_error!( SORT [ pub enum $enum_name $( #[ $meta] ) * ]
314
+ items [ ] buf [ ]
315
+ queue [ $( $chunks) * ] ) ;
316
+ } ;
317
+
318
+
319
+ (
320
+ WRAPPER $internal: ident [ $( $strdef: tt) * ] $strname: ident
321
+ $( #[ $meta: meta] ) *
322
+ ) => {
323
+ $( #[ $meta] ) *
324
+ $( $strdef) * $strname ( $internal ) ;
325
+
326
+ impl :: std:: fmt:: Display for $strname {
327
+ fn fmt( & self , f: & mut :: std:: fmt:: Formatter )
328
+ -> :: std:: fmt:: Result
329
+ {
330
+ :: std:: fmt:: Display :: fmt( & self . 0 , f)
331
+ }
332
+ }
333
+
334
+ impl From <$internal> for $strname {
335
+ fn from( err: $internal) -> Self {
336
+ $strname( err)
337
+ }
338
+ }
339
+
340
+ impl :: std:: error:: Error for $strname {
341
+ fn description( & self ) -> & str {
342
+ self . 0 . description( )
343
+ }
344
+ fn cause( & self ) -> Option <& :: std:: error:: Error > {
345
+ self . 0 . cause( )
346
+ }
347
+ }
348
+ } ;
349
+
281
350
// Queue is empty, can do the work
282
351
( SORT [ enum $name: ident $( #[ $meta: meta] ) * ]
283
352
items [ $( $( #[ $imeta: meta] ) *
@@ -918,6 +987,30 @@ mod test {
918
987
assert ! ( err. cause( ) . is_none( ) ) ;
919
988
}
920
989
990
+ quick_error ! {
991
+ #[ derive( Debug ) ]
992
+ pub enum Wrapper wraps Wrapped {
993
+ One
994
+ Two ( s: String ) {
995
+ display( "two: {}" , s)
996
+ from( )
997
+ }
998
+ }
999
+ }
1000
+
1001
+ #[ test]
1002
+ fn wrapper ( ) {
1003
+ assert_eq ! ( format!( "{}" , Wrapper :: from( Wrapped :: One ) ) ,
1004
+ "One" . to_string( ) ) ;
1005
+ assert_eq ! ( format!( "{}" ,
1006
+ Wrapper :: from( Wrapped :: from( String :: from( "hello" ) ) ) ) ,
1007
+ "two: hello" . to_string( ) ) ;
1008
+ assert_eq ! ( format!( "{:?}" , Wrapper :: from( Wrapped :: One ) ) ,
1009
+ "Wrapper(One)" . to_string( ) ) ;
1010
+ assert_eq ! ( Wrapper :: from( Wrapped :: One ) . description( ) ,
1011
+ "One" . to_string( ) ) ;
1012
+ }
1013
+
921
1014
quick_error ! {
922
1015
#[ derive( Debug , PartialEq ) ]
923
1016
pub enum TupleWrapper {
0 commit comments