dusk_dire/
internal_types.rs

1// This is a higher-order macro which takes in a macro and passes it all internal types and their members
2use crate::ty::Type;
3#[macro_export]
4macro_rules! define_internal_types {
5    ($name:ident) => {
6        $name!(
7            struct StringLiteral {
8                length: Type::usize(),
9                data: Type::u8().ptr(),
10            }
11        );
12    };
13}
14
15macro_rules! define_internal_types_impl {
16    ($(struct $name:ident {
17        $($field_name:ident: $ty:expr),*$(,)?
18    })*) => {
19        #[derive(Copy, Clone, Debug)]
20        pub enum InternalNamespace {
21            $($name),*
22        }
23
24        pub mod internal_field_decls {
25            use crate::hir::DeclId;
26            $(
27                #[derive(Debug)]
28                pub struct $name {
29                    $(
30                        pub $field_name: DeclId
31                    ),*
32                }
33                impl Default for $name {
34                    fn default() -> Self {
35                        $name {
36                            $(
37                                $field_name: DeclId::new(0)
38                            ),*
39                        }
40                    }
41                }
42            )*
43        }
44
45        #[derive(Default, Debug)]
46        #[allow(non_snake_case)]
47        pub struct InternalFieldDecls {
48            $(
49                pub $name: internal_field_decls::$name
50            ),*
51        }
52
53        pub mod internal_fields {
54            $(
55                #[derive(Copy, Clone, Debug, PartialEq, Eq)]
56                #[allow(non_camel_case_types)]
57                pub enum $name {
58                    $(
59                        $field_name
60                    ),*
61                }
62            )*
63        }
64        #[derive(Copy, Clone, Debug, PartialEq, Eq)]
65        pub enum InternalField {
66            $(
67                $name(internal_fields::$name)
68            ),*
69        }
70
71        impl InternalField {
72            pub fn ty(&self) -> Type {
73                match self {
74                    $(
75                        $(InternalField::$name(internal_fields::$name::$field_name) => $ty),*,
76                    )*
77                }
78            }
79
80            pub fn name(&self) -> &'static str {
81                match self {
82                    $(
83                        $(InternalField::$name(internal_fields::$name::$field_name) => stringify!($field_name)),*,
84                    )*
85                }
86            }
87        }
88    };
89}
90define_internal_types!(define_internal_types_impl);