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