| 117 | } |
| 118 | |
| 119 | fn parse_and(tokens: &[String], pos: &mut usize) -> Result<FtsQuery> { |
| 120 | let mut left = parse_not(tokens, pos)?; |
| 121 | while *pos < tokens.len() && tokens[*pos] == "&" { |
| 122 | *pos += 1; |
| 123 | let right = parse_not(tokens, pos)?; |
| 124 | left = match left { |
| 125 | FtsQuery::And(mut parts) => { |
| 126 | parts.push(right); |
| 127 | FtsQuery::And(parts) |
| 128 | } |
| 129 | other => FtsQuery::And(vec![other, right]), |
| 130 | }; |
| 131 | } |
| 132 | Ok(left) |
| 133 | } |
| 134 | |
| 135 | fn parse_not(tokens: &[String], pos: &mut usize) -> Result<FtsQuery> { |
| 136 | if *pos < tokens.len() && tokens[*pos] == "!" { |