radix_engine/utils/
macros.rs

1#[macro_export]
2macro_rules! event_schema {
3    ($aggregator: ident, [$($event_type: ty),* $(,)?]) => {
4        {
5            let mut event_schema = sbor::rust::collections::index_map_new();
6            $(
7                event_schema.insert(
8                    <$event_type as radix_common::traits::ScryptoEvent>::EVENT_NAME.to_string(),
9                    TypeRef::Static($aggregator.add_child_type_and_descendents::<$event_type>()),
10                );
11            )*
12            radix_blueprint_schema_init::BlueprintEventSchemaInit {
13                event_schema
14            }
15        }
16    };
17}
18
19#[macro_export]
20macro_rules! function_schema {
21    (
22        $aggregator: expr,
23        $blueprint_name: ident {
24            $(
25                $ident: ident: $receiver: expr
26            ),* $(,)?
27        } $(,)?
28    ) => {{
29        paste::paste! {
30            let mut functions = index_map_new();
31
32            $(
33                functions.insert(
34                    [<$blueprint_name:snake:upper _ $ident:snake:upper _IDENT>].to_string(),
35                    FunctionSchemaInit {
36                        receiver: $receiver,
37                        input: TypeRef::Static(
38                            $aggregator.add_child_type_and_descendents::<[<$blueprint_name:camel $ident:camel Input >]>(),
39                        ),
40                        output: TypeRef::Static(
41                            $aggregator.add_child_type_and_descendents::<[<$blueprint_name:camel $ident:camel Output >]>(),
42                        ),
43                        export: [<$blueprint_name:snake:upper _ $ident:snake:upper _EXPORT_NAME>].to_string(),
44                    },
45                );
46            )*
47
48            functions
49        }
50    }};
51}
52
53#[macro_export]
54macro_rules! dispatch {
55    (
56        $export_name_const_suffix: ident,
57        $export_name: expr,
58        $input: expr,
59        $api: expr,
60        $blueprint_ident: ident,
61        [
62            $($function_ident: ident),* $(,)?
63        ] $(,)?
64    ) => {
65        paste::paste! {
66            match $export_name {
67                $(
68                    [< $blueprint_ident:snake:upper _ $function_ident:snake:upper _ $export_name_const_suffix >] => {
69                        let input: [< $blueprint_ident:camel $function_ident:camel Input >] = $input.as_typed().map_err(|e| {
70                            RuntimeError::ApplicationError(ApplicationError::InputDecodeError(e))
71                        })?;
72                        let rtn: [< $blueprint_ident:camel $function_ident:camel Output >] = Self::$function_ident(input, $api)?;
73                        Ok(IndexedScryptoValue::from_typed(&rtn))
74                    }
75                ),*
76                _ => Err(RuntimeError::ApplicationError(
77                    ApplicationError::ExportDoesNotExist($export_name.to_string()),
78                )),
79            }
80        }
81    };
82}
83
84#[macro_export]
85macro_rules! add_role {
86    ($roles:expr, $role:expr) => {{
87        $roles.insert(
88            $role.into(),
89            radix_engine_interface::blueprints::resource::RoleList::none(),
90        );
91    }};
92    ($roles:expr, $role:expr => updaters: $updaters:expr) => {{
93        $roles.insert($role.into(), $updaters.into());
94    }};
95}
96
97#[macro_export]
98macro_rules! method_auth_template {
99    () => ({
100        let methods: IndexMap<radix_engine_interface::blueprints::resource::MethodKey, radix_engine_interface::blueprints::resource::MethodAccessibility>
101            = index_map_new();
102        methods
103    });
104    ($($method:expr => $entry:expr;)*) => ({
105        let mut methods: IndexMap<radix_engine_interface::blueprints::resource::MethodKey, radix_engine_interface::blueprints::resource::MethodAccessibility>
106            = index_map_new();
107        $(
108            methods.insert($method.into(), $entry.into());
109        )*
110        methods
111    });
112}
113
114#[macro_export]
115macro_rules! roles_template {
116    () => ({
117        radix_engine_interface::blueprints::package::StaticRoleDefinition {
118            roles: radix_engine_interface::blueprints::package::RoleSpecification::Normal(index_map_new()),
119            methods: index_map_new(),
120        }
121    });
122    (
123        roles { $($role:expr $( => updaters: $updaters:expr)?;)* },
124        methods { $($method:expr => $entry:expr; )* }
125    ) => ({
126        let mut methods: IndexMap<radix_engine_interface::blueprints::resource::MethodKey, radix_engine_interface::blueprints::resource::MethodAccessibility>
127            = index_map_new();
128        $(
129            methods.insert($method.into(), $entry.into());
130        )*
131
132        let mut roles: IndexMap<radix_engine_interface::blueprints::resource::RoleKey, radix_engine_interface::blueprints::resource::RoleList> = index_map_new();
133        $(
134            $crate::add_role!(roles, $role $( => updaters: $updaters)?);
135        )*
136
137        radix_engine_interface::blueprints::package::StaticRoleDefinition {
138            roles: radix_engine_interface::blueprints::package::RoleSpecification::Normal(roles),
139            methods,
140        }
141    });
142    ( methods { $($method:expr => $entry:expr;)* }) => ({
143        let mut methods: IndexMap<radix_engine_interface::blueprints::resource::MethodKey, radix_engine_interface::blueprints::resource::MethodAccessibility>
144            = index_map_new();
145        $(
146            methods.insert($method.into(), $entry.into());
147        )*
148
149        radix_engine_interface::blueprints::package::StaticRoleDefinition {
150            roles: radix_engine_interface::blueprints::package::RoleSpecification::Normal(index_map_new()),
151            methods,
152        }
153    });
154}