gorf_gen_macro/
lib.rs

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}