bon_macros/util/
meta_list.rs
1use crate::util::prelude::*;
2
3pub(crate) trait MetaListExt {
4 fn require_parens_delim(&self) -> Result<()>;
5 fn require_curly_braces_delim(&self) -> Result<()>;
6}
7
8impl MetaListExt for syn::MetaList {
9 fn require_parens_delim(&self) -> Result<()> {
10 require_delim(self, MacroDelimKind::Paren)
11 }
12
13 fn require_curly_braces_delim(&self) -> Result<()> {
14 require_delim(self, MacroDelimKind::Brace)
15 }
16}
17
18fn require_delim(meta: &syn::MetaList, expected: MacroDelimKind) -> Result<()> {
19 let actual = MacroDelimKind::from_syn(&meta.delimiter);
20 if actual == expected {
21 return Ok(());
22 }
23
24 let path = darling::util::path_to_string(&meta.path);
25 bail!(
26 meta,
27 "wrong delimiter, expected {} e.g. `{path}{}`, but got {}: `{path}{}`",
28 expected.name(),
29 expected.example(),
30 actual.name(),
31 actual.example(),
32 );
33}
34
35#[derive(PartialEq, Eq, Clone, Copy)]
36enum MacroDelimKind {
37 Paren,
38 Brace,
39 Bracket,
40}
41
42impl MacroDelimKind {
43 fn from_syn(delim: &syn::MacroDelimiter) -> Self {
44 match delim {
45 syn::MacroDelimiter::Paren(_) => Self::Paren,
46 syn::MacroDelimiter::Brace(_) => Self::Brace,
47 syn::MacroDelimiter::Bracket(_) => Self::Bracket,
48 }
49 }
50
51 fn name(self) -> &'static str {
52 match self {
53 Self::Paren => "parentheses",
54 Self::Brace => "curly braces",
55 Self::Bracket => "square brackets",
56 }
57 }
58
59 fn example(self) -> &'static str {
60 match self {
61 Self::Paren => "(...)",
62 Self::Brace => "{...}",
63 Self::Bracket => "[...]",
64 }
65 }
66}