codama_syn_helpers/extensions/
expr_array.rs1use crate::PathList;
2use quote::ToTokens;
3use syn::ExprArray;
4
5pub trait ExprArrayExtension {
6 fn get_self(&self) -> &ExprArray;
7
8 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}