Tokenize a SQL slice. Returns `Vec ` on success; any unexpected character produces `SqlError::Parse`.
(src: &str)
| 38 | /// Tokenize a SQL slice. Returns `Vec<Token>` on success; any unexpected |
| 39 | /// character produces `SqlError::Parse`. |
| 40 | pub fn tokenize(src: &str) -> Result<Vec<Token>, SqlError> { |
| 41 | let bytes = src.as_bytes(); |
| 42 | let mut out = Vec::with_capacity(src.len() / 4); |
| 43 | let mut i = 0; |
| 44 | while i < bytes.len() { |
| 45 | let b = bytes[i]; |
| 46 | // Whitespace. |
| 47 | if b.is_ascii_whitespace() { |
| 48 | i += 1; |
| 49 | continue; |
| 50 | } |
| 51 | // Single-line comment `-- ...`. |
| 52 | if b == b'-' && i + 1 < bytes.len() && bytes[i + 1] == b'-' { |
| 53 | while i < bytes.len() && bytes[i] != b'\n' { |
| 54 | i += 1; |
| 55 | } |
| 56 | continue; |
| 57 | } |
| 58 | // Punctuation. |
| 59 | match b { |
| 60 | b'(' => { |
| 61 | out.push(Token { |
| 62 | tok: Tok::LParen, |
| 63 | pos: i, |
| 64 | }); |
| 65 | i += 1; |
| 66 | continue; |
| 67 | } |
| 68 | b')' => { |
| 69 | out.push(Token { |
| 70 | tok: Tok::RParen, |
| 71 | pos: i, |
| 72 | }); |
| 73 | i += 1; |
| 74 | continue; |
| 75 | } |
| 76 | b'[' => { |
| 77 | out.push(Token { |
| 78 | tok: Tok::LBracket, |
| 79 | pos: i, |
| 80 | }); |
| 81 | i += 1; |
| 82 | continue; |
| 83 | } |
| 84 | b']' => { |
| 85 | out.push(Token { |
| 86 | tok: Tok::RBracket, |
| 87 | pos: i, |
| 88 | }); |
| 89 | i += 1; |
| 90 | continue; |
| 91 | } |
| 92 | b',' => { |
| 93 | out.push(Token { |
| 94 | tok: Tok::Comma, |
| 95 | pos: i, |
| 96 | }); |
| 97 | i += 1; |