extendr_macros/
list.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::parse_macro_input;
4
5use crate::pairs::Pairs;
6
7pub fn list(item: TokenStream) -> TokenStream {
8    let list = parse_macro_input!(item as Pairs);
9
10    let nv = list.names_and_values();
11
12    if nv.is_empty() {
13        TokenStream::from(quote!(extendr_api::wrapper::List::default()))
14    } else {
15        let values: Vec<proc_macro2::TokenStream> = nv
16            .iter()
17            .map(|(_n, v)| quote!( extendr_api::Robj::from(#v) ))
18            .collect();
19        if nv.iter().any(|(n, _v)| !n.is_empty()) {
20            let names: Vec<proc_macro2::TokenStream> =
21                nv.iter().map(|(n, _v)| quote!( #n )).collect();
22            // Note that this unwrap should not fail.
23            TokenStream::from(quote!(
24                extendr_api::List::from_names_and_values(&[# ( #names ),*], &[# ( #values ),*]).unwrap()
25            ))
26        } else {
27            TokenStream::from(quote!(
28                extendr_api::List::from_values(&[# ( #values ),*])
29            ))
30        }
31    }
32}