datex_core/ast/error/
pattern.rs1use 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}