use enumset::enum_set; use crate::lst_parser::{ error::SyntaxError, syntax_kind::{SyntaxKind::*, TokenSet}, CompletedMarker, Parser, }; use super::expression; pub fn pipeline(p: &mut Parser, start_expr: CompletedMarker) -> Option { if !pipe(p) { return Some(start_expr); } let pipeline_marker = start_expr.precede(p, "pipeline_start"); loop { if expression(p, true).is_none() { return Some(pipeline_marker.error(p, SyntaxError::PipelineNeedsSink)); } if !pipe(p) { return Some(pipeline_marker.complete(p, PIPELINE)); } } } pub const PIPES: TokenSet = enum_set!(PIPE | MAPPING_PIPE | NULL_PIPE); fn pipe(p: &mut Parser) -> bool { if PIPES.contains(p.current()) { p.do_bump(); true } else { false } }