1#[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}