radix_engine/utils/
macros.rs1#[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}