1#[derive(Debug)]
2pub enum Token {
3 Literal(char),
4 Any,
6 ZeroOrMore,
8 StartAlternative,
10 NextAlternative,
12 EndAlternative,
14 StartClass,
16 NegateClass,
18 EndClass,
20 ClassContent(char),
21}
22
23impl Token {
24 pub fn append_regex(&self, pattern: &mut String, is_first_in_component: bool) {
26 match self {
27 Token::Literal(c) => pattern.push_str(®ex::escape(&c.to_string())),
28 Token::Any => {
31 if is_first_in_component {
32 #[cfg(not(windows))]
33 pattern.push_str("[^./]");
34 #[cfg(windows)]
35 pattern.push_str("[^./\\\\]");
36 } else {
37 #[cfg(not(windows))]
38 pattern.push_str("[^/]");
39 #[cfg(windows)]
40 pattern.push_str("[^/\\\\]");
41 }
42 }
43 Token::ZeroOrMore => {
46 if is_first_in_component {
47 #[cfg(not(windows))]
48 pattern.push_str("[^./][^/]*");
49 #[cfg(windows)]
50 pattern.push_str("[^./\\\\][^/\\\\]*");
51 } else {
52 #[cfg(not(windows))]
53 pattern.push_str("[^/]*");
54 #[cfg(windows)]
55 pattern.push_str("[^/\\\\]*");
56 }
57 }
58 Token::StartAlternative => pattern.push('('),
59 Token::NextAlternative => pattern.push('|'),
60 Token::EndAlternative => pattern.push(')'),
61 Token::StartClass => pattern.push('['),
62 Token::NegateClass => pattern.push('^'),
63 Token::EndClass => pattern.push(']'),
64 Token::ClassContent(c) => pattern.push(*c),
65 }
66 }
67}