sp_runtime_interface_proc_macro/runtime_interface/
mod.rs1use crate::utils::generate_runtime_interface_include;
19
20use proc_macro2::{Span, TokenStream};
21
22use syn::{Ident, ItemTrait, Result};
23
24use inflector::Inflector;
25
26use quote::quote;
27
28mod bare_function_interface;
29mod host_function_interface;
30mod trait_decl_impl;
31
32pub mod keywords {
34 syn::custom_keyword!(wasm_only);
36 syn::custom_keyword!(no_tracing);
38}
39
40pub fn runtime_interface_impl(
45 trait_def: ItemTrait,
46 is_wasm_only: bool,
47 tracing: bool,
48) -> Result<TokenStream> {
49 let bare_functions = bare_function_interface::generate(&trait_def, is_wasm_only, tracing)?;
50 let crate_include = generate_runtime_interface_include();
51 let mod_name = Ident::new(&trait_def.ident.to_string().to_snake_case(), Span::call_site());
52 let trait_decl_impl = trait_decl_impl::process(&trait_def, is_wasm_only)?;
53 let host_functions = host_function_interface::generate(&trait_def, is_wasm_only)?;
54 let vis = trait_def.vis;
55 let attrs = &trait_def.attrs;
56
57 let res = quote! {
58 #( #attrs )*
59 #vis mod #mod_name {
60 use super::*;
61 #crate_include
62
63 #bare_functions
64
65 #trait_decl_impl
66
67 #host_functions
68 }
69 };
70
71 let res = expander::Expander::new("runtime_interface")
72 .dry(std::env::var("EXPAND_MACROS").is_err())
73 .verbose(true)
74 .write_to_out_dir(res)
75 .expect("Does not fail because of IO in OUT_DIR; qed");
76
77 Ok(res)
78}