codama_syn_helpers/extensions/
expr_array.rs

1use crate::PathList;
2use quote::ToTokens;
3use syn::ExprArray;
4
5pub trait ExprArrayExtension {
6    fn get_self(&self) -> &ExprArray;
7
8    /// Converts the expression array into a PathList with a dummy path.
9    fn as_path_list(&self) -> PathList {
10        let this = self.get_self();
11        PathList {
12            path: syn::parse_quote!(implicit_array),
13            eq_token: None,
14            delimiter: syn::MacroDelimiter::Bracket(this.bracket_token),
15            tokens: this.elems.to_token_stream(),
16        }
17    }
18}
19
20impl ExprArrayExtension for ExprArray {
21    fn get_self(&self) -> &ExprArray {
22        self
23    }
24}
25
26#[cfg(test)]
27mod tests {
28    use super::*;
29    use crate::{extensions::*, Meta};
30
31    #[test]
32    fn as_path_list_empty() {
33        let expr: ExprArray = syn::parse_quote! { [] };
34        let pl = expr.as_path_list();
35        let metas = pl.parse_metas().unwrap();
36        assert_eq!(pl.path.to_string(), "implicit_array");
37        assert_eq!(metas.len(), 0);
38    }
39
40    #[test]
41    fn as_path_list() {
42        let expr: ExprArray = syn::parse_quote! { [x = 1, y = 2, options(42)] };
43        let metas = expr.as_path_list().parse_metas().unwrap();
44        assert_eq!(metas.len(), 3);
45        assert!(matches!(&metas[0], Meta::PathValue(pv) if pv.path.is_ident("x")));
46        assert!(matches!(&metas[1], Meta::PathValue(pv) if pv.path.is_ident("y")));
47        assert!(matches!(&metas[2], Meta::PathList(pv) if pv.path.is_ident("options")));
48    }
49}