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}