diff --git a/crates/generate/Cargo.toml b/crates/generate/Cargo.toml index 2b89101bd3..886fea8b3b 100644 --- a/crates/generate/Cargo.toml +++ b/crates/generate/Cargo.toml @@ -14,3 +14,4 @@ quote = "1.0" proc-macro2 = "1.0" heck = "0.3" anyhow = "1" +syn = { version = "1.0", features = ["full"] } diff --git a/crates/generate/src/parse.rs b/crates/generate/src/config.rs similarity index 54% rename from crates/generate/src/parse.rs rename to crates/generate/src/config.rs index 65c8a190cc..3cb1cf5c09 100644 --- a/crates/generate/src/parse.rs +++ b/crates/generate/src/config.rs @@ -1,7 +1,37 @@ -use anyhow::{bail, Result}; -use proc_macro2::{Literal, TokenStream, TokenTree}; +use std::path::PathBuf; -pub fn witx_paths(args: TokenStream) -> Result> { +use syn::{ + bracketed, + parse::{Parse, ParseStream}, + punctuated::Punctuated, + token, LitStr, Result, Token, +}; + +pub struct Config { + _bracket_token: token::Bracket, + path_lits: Punctuated, +} + +impl Config { + pub fn witx_paths(&self) -> Vec { + self.path_lits + .iter() + .map(|lit| PathBuf::from(lit.value())) + .collect() + } +} + +impl Parse for Config { + fn parse(input: ParseStream) -> Result { + let content; + Ok(Config { + _bracket_token: bracketed!(content in input), + path_lits: content.parse_terminated(Parse::parse)?, + }) + } +} + +/* let arg_strings = args .into_iter() .map(|arg| match arg { @@ -31,3 +61,4 @@ fn string_literal(literal: Literal) -> Result { } Ok(trimmed) } +*/ diff --git a/crates/generate/src/lib.rs b/crates/generate/src/lib.rs index 49d9289d58..9b66c9e1e8 100644 --- a/crates/generate/src/lib.rs +++ b/crates/generate/src/lib.rs @@ -1,15 +1,16 @@ extern crate proc_macro; +mod config; mod funcs; mod module_trait; mod names; -mod parse; mod types; use proc_macro::TokenStream; -use proc_macro2::TokenStream as TokenStream2; use quote::quote; +use syn::parse_macro_input; +use config::Config; use funcs::define_func; use module_trait::define_module_trait; use names::Names; @@ -17,12 +18,11 @@ use types::define_datatype; #[proc_macro] pub fn from_witx(args: TokenStream) -> TokenStream { - let args = TokenStream2::from(args); - let witx_paths = parse::witx_paths(args).expect("parsing macro arguments"); + let config = parse_macro_input!(args as Config); let names = Names::new(); // TODO parse the names from the invocation of the macro, or from a file? - let doc = witx::load(&witx_paths).expect("loading witx"); + let doc = witx::load(&config.witx_paths()).expect("loading witx"); let types = doc.typenames().map(|t| define_datatype(&names, &t)); diff --git a/src/lib.rs b/src/lib.rs index c28934faf9..65356c89a5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,6 @@ pub mod test { // FIXME: parameterize macro on what ctx type is used here - generate::from_witx!("test.witx"); + generate::from_witx!(["test.witx"]); pub struct WasiCtx { guest_errors: Vec<::memory::GuestError>,