This repository has been archived by the owner on Mar 24, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 164
/
lib.rs
54 lines (47 loc) · 1.58 KB
/
lib.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::parse_macro_input;
use wiggle_generate::{define_func, define_module_trait, Names};
mod config;
#[proc_macro]
pub fn bindings(args: TokenStream) -> TokenStream {
let config = parse_macro_input!(args as config::Config);
let doc = wasi_common::wasi::metadata::document();
let names = Names::new(&config.ctx_name, quote!(lucet_wiggle));
let error_transform = if let Some(error_conf) = config.error_conf {
wiggle_generate::ErrorTransform::new(&error_conf, &doc)
.expect("constructing error transform")
} else {
wiggle_generate::ErrorTransform::empty()
};
let modules = doc.modules().map(|module| {
let modname = names.module(&module.name);
let fs = module
.funcs()
.map(|f| define_func(&names, &module, &f, &error_transform));
let modtrait = define_module_trait(&names, &module, &error_transform);
let ctx_type = names.ctx_type();
quote! {
pub mod #modname {
use super::#ctx_type;
use wasi_common::wasi::types::*;
#(#fs)*
#modtrait
}
}
});
let mut ts = quote! {
#(#modules)*
};
let empty = quote!();
ts.extend(lucet_wiggle::generate::generate(
&doc,
&config.ctx_name,
&config.constructor,
"e!(wasi_common::wasi),
config.pre_hook.as_ref().unwrap_or(&empty),
config.post_hook.as_ref().unwrap_or(&empty),
));
TokenStream::from(ts)
}