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}