1extern crate proc_macro;
2use std::convert::Infallible;
3
4use chumsky::Parser;
5use gorf_gen_core::Opts;
6use proc_macro::TokenStream;
7use quote::quote;
8use syn::{parse::Parse, parse_macro_input, Ident, LitStr, Token};
9
10struct X {
11 pub s: LitStr,
12 pub opts: Opts,
13}
14impl Parse for X {
15 fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
16 let mut o = X {
17 s: input.parse()?,
18 opts: Opts {
19 path: quote! {::lambda_rt},
20 },
21 };
22 while input.lookahead1().peek(Ident) {
23 let i: Ident = input.parse()?;
24 let _eq: Token![=] = input.parse()?;
25 match i.to_string().as_str() {
26 "crate_path" => {
27 let s: syn::LitStr = input.parse()?;
28 o.opts.path = s.parse()?;
29 }
30 _ => return Err(syn::Error::new(i.span(), "unexpected type")),
31 };
32 let _comma: Token![,] = input.parse()?;
33 }
34 return Ok(o);
35 }
36}
37#[proc_macro]
38pub fn lamc(tokens: TokenStream) -> TokenStream {
39 let s = parse_macro_input!(tokens as X);
40 let g = gorf_core::str_parser().parse(s.s.value()).unwrap();
41 return TokenStream::from(gorf_gen_core::emit(&g, &s.opts));
42}
43#[cfg(test)]
44mod tests {
45 use super::*;
46}