@@ -50,6 +50,8 @@ limitations under the License.
5050extern crate proc_macro;
5151
5252use hyperlight_component_util:: * ;
53+ use syn:: parse:: { Parse , ParseStream } ;
54+ use syn:: { Ident , LitStr , Result , Token } ;
5355
5456/// Create host bindings for the wasm component type in the file
5557/// passed in (or `$WIT_WORLD`, if nothing is passed in). This will
@@ -66,11 +68,14 @@ use hyperlight_component_util::*;
6668#[ proc_macro]
6769pub fn host_bindgen ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
6870 let _ = env_logger:: try_init ( ) ;
69- let path: Option < syn:: LitStr > = syn:: parse_macro_input!( input as Option <syn:: LitStr >) ;
70- let path = path
71- . map ( |x| x. value ( ) . into ( ) )
72- . unwrap_or_else ( || std:: env:: var_os ( "WIT_WORLD" ) . unwrap ( ) ) ;
73- util:: read_wit_type_from_file ( path, |kebab_name, ct| {
71+ let parsed_bindgen_input = syn:: parse_macro_input!( input as BindgenInputParams ) ;
72+ let path = match parsed_bindgen_input. path {
73+ Some ( path_env) => path_env. into_os_string ( ) ,
74+ None => std:: env:: var_os ( "WIT_WORLD" ) . unwrap ( ) ,
75+ } ;
76+
77+ let world_name = parsed_bindgen_input. world_name ;
78+ util:: read_wit_type_from_file ( path, world_name, |kebab_name, ct| {
7479 let decls = emit:: run_state ( false , false , |s| {
7580 rtypes:: emit_toplevel ( s, & kebab_name, ct) ;
7681 host:: emit_toplevel ( s, & kebab_name, ct) ;
@@ -89,11 +94,14 @@ pub fn host_bindgen(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
8994#[ proc_macro]
9095pub fn guest_bindgen ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
9196 let _ = env_logger:: try_init ( ) ;
92- let path: Option < syn:: LitStr > = syn:: parse_macro_input!( input as Option <syn:: LitStr >) ;
93- let path = path
94- . map ( |x| x. value ( ) . into ( ) )
95- . unwrap_or_else ( || std:: env:: var_os ( "WIT_WORLD" ) . unwrap ( ) ) ;
96- util:: read_wit_type_from_file ( path, |kebab_name, ct| {
97+ let parsed_bindgen_input = syn:: parse_macro_input!( input as BindgenInputParams ) ;
98+ let path = match parsed_bindgen_input. path {
99+ Some ( path_env) => path_env. into_os_string ( ) ,
100+ None => std:: env:: var_os ( "WIT_WORLD" ) . unwrap ( ) ,
101+ } ;
102+
103+ let world_name = parsed_bindgen_input. world_name ;
104+ util:: read_wit_type_from_file ( path, world_name, |kebab_name, ct| {
97105 let decls = emit:: run_state ( true , false , |s| {
98106 // Emit type/trait definitions for all instances in the world
99107 rtypes:: emit_toplevel ( s, & kebab_name, ct) ;
@@ -107,3 +115,51 @@ pub fn guest_bindgen(input: proc_macro::TokenStream) -> proc_macro::TokenStream
107115 util:: emit_decls ( decls) . into ( )
108116 } )
109117}
118+
119+ #[ derive( Debug ) ]
120+ struct BindgenInputParams {
121+ world_name : Option < String > ,
122+ path : Option < std:: path:: PathBuf > ,
123+ }
124+
125+ impl Parse for BindgenInputParams {
126+ fn parse ( input : ParseStream ) -> Result < Self > {
127+ let mut path = None ;
128+ let mut world_name = None ;
129+
130+ if input. peek ( syn:: token:: Brace ) {
131+ let content;
132+ syn:: braced!( content in input) ;
133+
134+ // Parse key-value pairs inside the braces
135+ while !content. is_empty ( ) {
136+ let key: Ident = content. parse ( ) ?;
137+ content. parse :: < Token ! [ : ] > ( ) ?;
138+
139+ match key. to_string ( ) . as_str ( ) {
140+ "world_name" => {
141+ let value: LitStr = content. parse ( ) ?;
142+ world_name = Some ( value. value ( ) ) ;
143+ }
144+ "path" => {
145+ let value: LitStr = content. parse ( ) ?;
146+ path = Some ( std:: path:: PathBuf :: from ( value. value ( ) ) ) ;
147+ }
148+ _ => {
149+ return Err ( syn:: Error :: new ( key. span ( ) , format ! ( "Unknown key: {}" , key) ) ) ;
150+ }
151+ }
152+ // Parse optional comma
153+ if content. peek ( Token ! [ , ] ) {
154+ content. parse :: < Token ! [ , ] > ( ) ?;
155+ }
156+ }
157+ } else {
158+ let option_path_litstr = input. parse :: < Option < syn:: LitStr > > ( ) ?;
159+ if let Some ( concrete_path) = option_path_litstr {
160+ path = Some ( std:: path:: PathBuf :: from ( concrete_path. value ( ) ) ) ;
161+ }
162+ }
163+ Ok ( Self { world_name, path } )
164+ }
165+ }
0 commit comments