| 95 | } |
| 96 | |
| 97 | pub fn tokenize_format_string(input: &str) -> Vec<Token> { |
| 98 | let mut result: Vec<Token> = vec![]; |
| 99 | let mut inside_brackets = false; |
| 100 | |
| 101 | let mut cur = String::new(); |
| 102 | |
| 103 | for character in input.chars() { |
| 104 | if character == '{' { |
| 105 | if inside_brackets { |
| 106 | cur.push('{'); |
| 107 | } |
| 108 | if !cur.is_empty() { |
| 109 | if let Some(Token::String(s)) = result.last_mut() { |
| 110 | s.push_str(&cur); |
| 111 | } else { |
| 112 | result.push(Token::String(cur.clone())); |
| 113 | } |
| 114 | cur.clear(); |
| 115 | } |
| 116 | inside_brackets = true; |
| 117 | } else if character == '}' { |
| 118 | if !inside_brackets { |
| 119 | cur.push('}'); |
| 120 | continue; |
| 121 | } |
| 122 | |
| 123 | inside_brackets = false; |
| 124 | |
| 125 | // if the contains for the brackets aren't valid we will just consider |
| 126 | // the contents including the brackets to be a string |
| 127 | if let Some(token) = parse_inner_brackets(&cur) { |
| 128 | result.push(token); |
| 129 | } else if let Some(Token::String(s)) = result.last_mut() { |
| 130 | s.push_str(&format!("{{{}}}", cur)); |
| 131 | } else { |
| 132 | result.push(Token::String(format!("{{{}}}", cur))); |
| 133 | } |
| 134 | cur.clear(); |
| 135 | } else { |
| 136 | cur.push(character) |
| 137 | }; |
| 138 | } |
| 139 | |
| 140 | if inside_brackets { |
| 141 | cur.push('{'); |
| 142 | } |
| 143 | |
| 144 | if let Some(Token::String(s)) = result.last_mut() { |
| 145 | s.push_str(&cur); |
| 146 | } else { |
| 147 | result.push(Token::String(cur)); |
| 148 | } |
| 149 | |
| 150 | // for token in &result{ println!("(debug) tokenized: {}", token) } |
| 151 | |
| 152 | result |
| 153 | } |
| 154 | |