1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#[derive(PartialEq, Clone, Copy, Debug)]
pub enum Punctuator {
    Default, // = - may be used for default value
    Or, // |
    Neg, // -

    // Generics
    GenericOpen, // <
    GenericClose, // >

    // Symbols
    Colon, // :
    SemiColon, // ;
    Dot, // .
    Comma, // ,
    Spread, // ...
    At, // @ - Used for directives
    DoubleColon, // ::

    // Brackets, Parenthesis, Blocks
    OpenBlock, // {
    CloseBlock, // }
    OpenParen, // (
    CloseParen, // )
    OpenBracket, // [
    CloseBracket, // ]
}

impl Punctuator {
    pub fn from_str(s: &str) -> Option<Self> {
        match s {
            "=" => Some(Punctuator::Default),
            "|" => Some(Punctuator::Or),
            "-" => Some(Punctuator::Neg),

            "<" => Some(Punctuator::GenericOpen),
            ">" => Some(Punctuator::GenericClose),

            ":" => Some(Punctuator::Colon),
            ";" => Some(Punctuator::SemiColon),
            "." => Some(Punctuator::Dot),
            "," => Some(Punctuator::Comma),
            "..." => Some(Punctuator::Spread),
            "@" => Some(Punctuator::At),
            "::" => Some(Punctuator::DoubleColon),

            "{" => Some(Punctuator::OpenBlock),
            "}" => Some(Punctuator::CloseBlock),
            "(" => Some(Punctuator::OpenParen),
            ")" => Some(Punctuator::CloseParen),
            "[" => Some(Punctuator::OpenBracket),
            "]" => Some(Punctuator::CloseBracket),
            _ => None,
        }
    }
}