(&mut self)
| 152 | } |
| 153 | |
| 154 | fn parse_primary(&mut self) -> Result<Expr, PromqlError> { |
| 155 | match self.peek().clone() { |
| 156 | Token::Number(n) => { |
| 157 | self.advance(); |
| 158 | Ok(Expr::Scalar(n)) |
| 159 | } |
| 160 | Token::String(s) => { |
| 161 | self.advance(); |
| 162 | Ok(Expr::StringLiteral(s)) |
| 163 | } |
| 164 | Token::LParen => { |
| 165 | self.advance(); |
| 166 | let expr = self.parse_expr(0)?; |
| 167 | self.expect(&Token::RParen)?; |
| 168 | Ok(Expr::Paren(Box::new(expr))) |
| 169 | } |
| 170 | Token::LBrace => { |
| 171 | let matchers = self.parse_label_matchers()?; |
| 172 | Ok(Expr::VectorSelector { |
| 173 | name: None, |
| 174 | matchers, |
| 175 | offset: None, |
| 176 | }) |
| 177 | } |
| 178 | Token::Ident(name) => { |
| 179 | if let Some(agg_op) = parse_agg_op(&name) { |
| 180 | return self.parse_aggregation(agg_op); |
| 181 | } |
| 182 | self.advance(); |
| 183 | self.parse_ident_continuation(name) |
| 184 | } |
| 185 | other => Err(PromqlError::UnexpectedToken { |
| 186 | expected: "expression".to_string(), |
| 187 | found: format!("{other:?}"), |
| 188 | }), |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | fn parse_ident_continuation(&mut self, name: String) -> Result<Expr, PromqlError> { |
| 193 | if matches!(self.peek(), Token::LParen) { |
no test coverage detected