MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / parse_case

Function parse_case

nodedb-query/src/expr_parse/parser.rs:274–316  ·  view source on GitHub ↗
(
    tokens: &[Token],
    pos: &mut usize,
    depth: &mut usize,
)

Source from the content-addressed store, hash-verified

272}
273
274fn parse_case(
275 tokens: &[Token],
276 pos: &mut usize,
277 depth: &mut usize,
278) -> Result<SqlExpr, ExprParseError> {
279 let mut when_thens = Vec::new();
280 let mut else_expr = None;
281
282 loop {
283 if peek_keyword(tokens, *pos, "WHEN") {
284 *pos += 1;
285 let cond = parse_expr(tokens, pos, depth)?;
286 expect_keyword(tokens, pos, "THEN")?;
287 let then = parse_expr(tokens, pos, depth)?;
288 when_thens.push((cond, then));
289 } else if peek_keyword(tokens, *pos, "ELSE") {
290 *pos += 1;
291 else_expr = Some(Box::new(parse_expr(tokens, pos, depth)?));
292 } else if peek_keyword(tokens, *pos, "END") {
293 *pos += 1;
294 break;
295 } else {
296 return Err(ExprParseError::UnexpectedToken {
297 found: tokens
298 .get(*pos)
299 .map_or("EOF".to_string(), |t| t.text.clone()),
300 pos: *pos,
301 });
302 }
303 }
304
305 if when_thens.is_empty() {
306 return Err(ExprParseError::InvalidLiteral {
307 detail: "CASE requires at least one WHEN clause".to_string(),
308 });
309 }
310
311 Ok(SqlExpr::Case {
312 operand: None,
313 when_thens,
314 else_expr,
315 })
316}
317
318fn parse_arg_list(
319 tokens: &[Token],

Callers 1

parse_primaryFunction · 0.85

Calls 8

peek_keywordFunction · 0.85
expect_keywordFunction · 0.85
to_stringMethod · 0.80
parse_exprFunction · 0.70
pushMethod · 0.45
getMethod · 0.45
cloneMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected