dusk_dire/
internal_types.rs1use 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);