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 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}