surrealdb_core/syn/lexer/compound/
regex.rs1use regex::Regex;
2
3use crate::syn::{
4 error::{bail, syntax_error, SyntaxError},
5 lexer::Lexer,
6 token::{t, Token},
7};
8
9pub fn regex(lexer: &mut Lexer, start: Token) -> Result<Regex, SyntaxError> {
10 assert_eq!(start.kind, t!("/"), "Invalid start token of regex compound");
11 lexer.scratch.clear();
12
13 loop {
14 match lexer.reader.next() {
15 Some(b'\\') => {
16 if lexer.eat(b'/') {
18 lexer.scratch.push('/');
19 } else {
20 lexer.scratch.push('\\');
21 }
22 }
23 Some(b'/') => break,
24 Some(x) => {
25 if !x.is_ascii() {
26 match lexer.reader.complete_char(x) {
27 Err(e) => {
28 let span = lexer.current_span();
29 bail!("Invalid token: {e}", @span);
30 }
31 Ok(x) => {
32 lexer.scratch.push(x);
33 }
34 }
35 } else {
36 lexer.scratch.push(x as char);
37 }
38 }
39 None => {
40 let span = lexer.current_span();
41 bail!("Failed to lex regex, unexpected eof", @span);
42 }
43 }
44 }
45
46 let span = lexer.current_span();
47 let regex = lexer.scratch.parse().map_err(|e| syntax_error!("Invalid regex: {e}", @span))?;
48 lexer.scratch.clear();
49 Ok(regex)
50}