extendr_macros/
pairlist.rs
1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, parse_quote, Expr, ExprAssign, ExprPath};
4
5use crate::pairs::Pairs;
6
7pub fn pairlist(item: TokenStream) -> TokenStream {
8 let pairlist = parse_macro_input!(item as Pairs);
9 let pairs = pairlist
10 .pairs
11 .iter()
12 .map(|e| {
13 if let Expr::Assign(ExprAssign { left, right, .. }) = e {
14 if let Expr::Path(ExprPath { path, .. }) = &**left {
15 let s = path.get_ident().unwrap().to_string();
16 return parse_quote!( (#s, extendr_api::Robj::from(#right)) );
17 }
18 }
19 parse_quote!( ("", extendr_api::Robj::from(#e)) )
20 })
21 .collect::<Vec<Expr>>();
22
23 if pairs.is_empty() {
24 TokenStream::from(quote!(extendr_api::wrapper::Pairlist::from(())))
25 } else {
26 TokenStream::from(quote!(
27 extendr_api::wrapper::Pairlist::from_pairs(&[# ( #pairs ),*])
28 ))
29 }
30}