1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Copyright (c) 2021, BlockProject 3D
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//     * Redistributions of source code must retain the above copyright notice,
//       this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above copyright notice,
//       this list of conditions and the following disclaimer in the documentation
//       and/or other materials provided with the distribution.
//     * Neither the name of BlockProject 3D nor the names of its contributors
//       may be used to endorse or promote products derived from this software
//       without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

//! Utility generation macros mainly designed for BPX and IO related error types.

#[macro_export]
/// Automatically implements conversion from the given set of error types.
macro_rules! impl_err_conversion {
    ($self: ident { $($foreign: ty => $variant: ident),* }) => {
        $(
            impl From<$foreign> for $self
            {
                fn from(e: $foreign) -> Self
                {
                    return $self::$variant(e);
                }
            }
        )*
    };
}

#[macro_export]
/// Generates an enum where each variant is assigned a &'static str name.
macro_rules! named_enum {
    (
        $(#[$enum_outer:meta])* $name: ident { $($(#[$outer:meta])* $variant: ident : $namestr: expr),* }
    ) => {
        $(#[$enum_outer])*
        #[derive(Debug)]
        pub enum $name
        {
            $(
                $(#[$outer])*
                $variant
            ),*
        }

        impl $name
        {
            /// Returns the string corresponding to the current enum variant.
            pub fn name(&self) -> &'static str
            {
                return match self {
                    $(Self::$variant => $namestr),*
                };
            }
        }
    };
}

pub use impl_err_conversion;
pub use named_enum;