1 macro_rules! type_wrapper {
2     (
3         $(#[$attr:meta])*
4         pub struct $name:ident { pub(crate) ty: $ty:ty, }
5 
6         clone: $clone:ident,
7         delete: $delete:ident,
8         $(equal: $equal:ident,)?
9     ) => {
10         #[derive(Clone)]
11         $(#[$attr])*
12         pub struct $name {
13             pub(crate) ty: $ty,
14         }
15 
16         impl From<$ty> for $name {
17             fn from(ty: $ty) -> Self {
18                 $name { ty }
19             }
20         }
21 
22         #[unsafe(no_mangle)]
23         pub extern "C" fn $clone(ty: &$name) -> Box<$name> {
24             Box::new(ty.clone())
25         }
26 
27         $(
28             #[unsafe(no_mangle)]
29             pub extern "C" fn $equal(a: &$name, b: &$name) -> bool {
30                 a.ty == b.ty
31             }
32         )?
33 
34         #[unsafe(no_mangle)]
35         pub extern "C" fn $delete(_ty: Option<Box<$name>>) {}
36     };
37 }
38 
39 mod component;
40 mod func;
41 mod instance;
42 mod module;
43 mod resource;
44 mod val;
45 
46 pub use component::*;
47 pub use func::*;
48 pub use instance::*;
49 pub use module::*;
50 pub use resource::*;
51 pub use val::*;
52