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}