MCPcopy Create free account
hub / github.com/PRQL/prql / range

Function range

prqlc/prqlc-parser/src/parser/expr.rs:280–337  ·  view source on GitHub ↗
(expr: E)

Source from the content-addressed store, hash-verified

278}
279
280fn range<'a, I, E>(expr: E) -> impl Parser<'a, I, Expr, ParserError<'a>> + Clone + 'a
281where
282 I: Input<'a, Token = lr::Token, Span = Span> + BorrowInput<'a>,
283 E: Parser<'a, I, Expr, ParserError<'a>> + Clone + 'a,
284{
285 // Ranges have five cases we need to parse:
286 // x..y (bounded)
287 // x.. (only start bound)
288 // x (no-op)
289 // ..y (only end bound)
290 // .. (unbounded)
291 #[derive(Clone)]
292 enum RangeCase {
293 NoOp(Expr),
294 Range(Option<Expr>, Option<Expr>),
295 }
296 choice((
297 // with start bound (first 3 cases)
298 expr.clone()
299 .then(choice((
300 // range and end bound
301 select_ref! { lr::Token { kind: TokenKind::Range { bind_left: true, bind_right: true }, .. } => () }
302 .ignore_then(expr.clone())
303 .map(|x| Some(Some(x))),
304 // range and no end bound
305 select_ref! { lr::Token { kind: TokenKind::Range { bind_left: true, .. }, .. } => Some(None) },
306 // no range
307 empty().to(None),
308 )))
309 .map(|(start, range)| {
310 if let Some(end) = range {
311 RangeCase::Range(Some(start), end)
312 } else {
313 RangeCase::NoOp(start)
314 }
315 }),
316 // only end bound
317 select_ref! { lr::Token { kind: TokenKind::Range { bind_right: true, .. }, .. } => () }
318 .ignore_then(expr)
319 .map(|range| RangeCase::Range(None, Some(range))),
320 // unbounded
321 select_ref! { lr::Token { kind: TokenKind::Range { .. }, .. } => RangeCase::Range(None, None) },
322 ))
323 .map_with(|case, extra| {
324 let span = extra.span();
325 match case {
326 RangeCase::NoOp(x) => x,
327 RangeCase::Range(start, end) => {
328 let kind = ExprKind::Range(Range {
329 start: start.map(Box::new),
330 end: end.map(Box::new),
331 });
332 kind.into_expr(span)
333 }
334 }
335 })
336 .boxed()
337}

Callers 1

exprFunction · 0.70

Calls 5

RangeClass · 0.85
mapMethod · 0.80
toMethod · 0.80
into_exprMethod · 0.80
spanMethod · 0.45

Tested by

no test coverage detected