rexplode/
ast.rs

1use regex_syntax::ast::*;
2
3pub trait ToString {
4  fn to_string(&self) -> String;
5}
6
7impl ToString for Literal {
8  fn to_string(&self) -> String {
9    self.c.to_string()
10  }
11}
12
13impl ToString for ClassAscii {
14  fn to_string(&self) -> String {
15    use ClassAsciiKind::*;
16
17    format!(
18      "[:{}{}:]",
19      if self.negated { "^" } else { "" },
20      match &self.kind {
21        Alnum => "alnum",
22        Alpha => "alpha",
23        Ascii => "ascii",
24        Blank => "blank",
25        Cntrl => "cntrl",
26        Digit => "digit",
27        Graph => "graph",
28        Lower => "lower",
29        Print => "print",
30        Punct => "punct",
31        Space => "space",
32        Upper => "upper",
33        Word => "word",
34        Xdigit => "xdigit",
35      }
36    )
37  }
38}
39
40impl ToString for ClassUnicode {
41  fn to_string(&self) -> String {
42    use ClassUnicodeKind::*;
43    use ClassUnicodeOpKind::*;
44
45    format!(
46      r"\{}{}",
47      if self.negated { 'P' } else { 'p' },
48      match &self.kind {
49        OneLetter(letter) => letter.to_string(),
50        Named(name) => format!("{{{}}}", name),
51        NamedValue { op: Equal, name, value } => format!("{{{}={}}}", name, value),
52        NamedValue { op: Colon, name, value } => format!("{{{}:{}}}", name, value),
53        NamedValue {
54          op: NotEqual,
55          name,
56          value,
57        } => format!("{{{}!={}}}", name, value),
58      }
59    )
60  }
61}
62
63impl ToString for ClassPerl {
64  fn to_string(&self) -> String {
65    use ClassPerlKind::*;
66
67    format!(
68      r"\{}",
69      match &self.kind {
70        Digit if self.negated => 'D',
71        Digit => 'd',
72        Space if self.negated => 'S',
73        Space => 's',
74        Word if self.negated => 'W',
75        Word => 'w',
76      }
77    )
78  }
79}
80
81impl ToString for ClassBracketed {
82  fn to_string(&self) -> String {
83    format!("[{}{}]", if self.negated { "^" } else { "" }, self.kind.to_string(),)
84  }
85}
86
87impl ToString for ClassSet {
88  fn to_string(&self) -> String {
89    use ClassSet::*;
90
91    match &self {
92      Item(item) => item.to_string(),
93      BinaryOp(op) => op.to_string(),
94    }
95  }
96}
97
98impl ToString for ClassSetItem {
99  fn to_string(&self) -> String {
100    use ClassSetItem::*;
101
102    match self {
103      Empty(_) => "".to_string(),
104      Literal(literal) => literal.to_string(),
105      Range(range) => range.to_string(),
106      Ascii(ascii) => ascii.to_string(),
107      Unicode(unicode) => unicode.to_string(),
108      Perl(perl) => perl.to_string(),
109      Bracketed(bracketed) => bracketed.to_string(),
110      Union(union) => union.to_string(),
111    }
112  }
113}
114
115impl ToString for ClassSetRange {
116  fn to_string(&self) -> String {
117    format!("{}-{}", self.start.to_string(), self.end.to_string())
118  }
119}
120
121impl ToString for ClassSetUnion {
122  fn to_string(&self) -> String {
123    self.items.iter().map(ToString::to_string).collect()
124  }
125}
126
127impl ToString for ClassSetBinaryOp {
128  fn to_string(&self) -> String {
129    use ClassSetBinaryOpKind::*;
130
131    match &self.kind {
132      Intersection => format!("{}&&{}", self.lhs.to_string(), self.rhs.to_string()),
133      Difference => format!("{}--{}", self.lhs.to_string(), self.rhs.to_string()),
134      SymmetricDifference => format!("{}~~{}", self.lhs.to_string(), self.rhs.to_string()),
135    }
136  }
137}