datex_core/ast/error/
pattern.rs

1use std::fmt;
2
3use crate::ast::lexer::Token;
4
5#[derive(Debug, PartialEq, Eq, Clone)]
6pub enum Pattern {
7    Char(char),
8    Any,
9    Token(Token),
10    Declaration,
11    List,
12    Literal,
13    EndOfInput,
14    SomethingElse,
15
16    Custom(&'static str),
17}
18
19impl From<char> for Pattern {
20    fn from(c: char) -> Self {
21        Self::Char(c)
22    }
23}
24impl From<Token> for Pattern {
25    fn from(tok: Token) -> Self {
26        Self::Token(tok)
27    }
28}
29impl From<&Token> for Pattern {
30    fn from(tok: &Token) -> Self {
31        Self::Token(tok.clone())
32    }
33}
34
35impl fmt::Display for Pattern {
36    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
37        match self {
38            Pattern::Custom(name) => write!(f, "{}", name),
39            Pattern::Declaration => write!(f, "declaration"),
40            Pattern::List => write!(f, "list"),
41            Pattern::SomethingElse => write!(f, "something else"),
42            Pattern::Any => write!(f, "any"),
43            Pattern::Token(token) => write!(f, "{}", token),
44            Pattern::Char(c) => write!(f, "{:?}", c),
45            Pattern::Literal => write!(f, "literal"),
46            Pattern::EndOfInput => write!(f, "end of input"),
47        }
48    }
49}
50impl Pattern {
51    pub fn kind(&self) -> &'static str {
52        match self {
53            Pattern::Custom(name) => name,
54            Pattern::Declaration => "declaration",
55            Pattern::List => "list",
56            Pattern::SomethingElse => "token",
57            Pattern::Any => "token",
58            Pattern::Token(_) => "token",
59            Pattern::Char(_) => "character",
60            Pattern::Literal => "literal",
61            Pattern::EndOfInput => "end of input",
62        }
63    }
64    pub fn as_string(&self) -> String {
65        match self {
66            Pattern::Custom(name) => name.to_string(),
67            Pattern::Declaration => "declaration".to_string(),
68            Pattern::List => "list".to_string(),
69            Pattern::SomethingElse => "something else".to_string(),
70            Pattern::Any => "any".to_string(),
71            Pattern::Token(token) => token.as_string(),
72            Pattern::Char(c) => format!("'{:?}'", c),
73            Pattern::Literal => "literal".to_string(),
74            Pattern::EndOfInput => "end of input".to_string(),
75        }
76    }
77}