Skip to main content

moxy_token/
delim.rs

1/// The delimiter kind of a grouped token sequence.
2#[derive(Debug, Default, Copy, Clone, PartialEq, Eq, Hash)]
3#[cfg_attr(feature = "serde", derive(serde::Serialize), serde(rename_all = "lowercase"))]
4pub enum Delim {
5    #[default]
6    None,
7    Paren,
8    Brace,
9    Bracket,
10}
11
12impl Delim {
13    #[inline]
14    pub fn from_char(ch: char) -> Option<Self> {
15        match ch {
16            '(' | ')' => Some(Self::Paren),
17            '[' | ']' => Some(Self::Bracket),
18            '{' | '}' => Some(Self::Brace),
19            _ => None,
20        }
21    }
22
23    #[inline]
24    pub fn from_open(ch: char) -> Option<Self> {
25        match ch {
26            '(' => Some(Self::Paren),
27            '[' => Some(Self::Bracket),
28            '{' => Some(Self::Brace),
29            _ => None,
30        }
31    }
32
33    #[inline]
34    pub fn from_close(ch: char) -> Option<Self> {
35        match ch {
36            ')' => Some(Self::Paren),
37            ']' => Some(Self::Bracket),
38            '}' => Some(Self::Brace),
39            _ => None,
40        }
41    }
42
43    #[inline]
44    pub fn as_str(&self) -> &'static str {
45        match self {
46            Self::Paren => "paren",
47            Self::Brace => "brace",
48            Self::Bracket => "bracket",
49            Self::None => "none",
50        }
51    }
52
53    #[inline]
54    pub fn open(&self) -> char {
55        match self {
56            Self::None => ' ',
57            Self::Brace => '{',
58            Self::Bracket => '[',
59            Self::Paren => '(',
60        }
61    }
62
63    #[inline]
64    pub fn close(&self) -> char {
65        match self {
66            Self::None => ' ',
67            Self::Brace => '}',
68            Self::Bracket => ']',
69            Self::Paren => ')',
70        }
71    }
72
73    #[inline]
74    pub fn is_none(&self) -> bool {
75        matches!(self, Self::None)
76    }
77
78    #[inline]
79    pub fn is_brace(&self) -> bool {
80        matches!(self, Self::Brace)
81    }
82
83    #[inline]
84    pub fn is_bracket(&self) -> bool {
85        matches!(self, Self::Bracket)
86    }
87
88    #[inline]
89    pub fn is_paren(&self) -> bool {
90        matches!(self, Self::Paren)
91    }
92}