forked from katzen-cafe/iowo
36 lines
854 B
Rust
36 lines
854 B
Rust
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<CompletedMarker> {
|
|
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
|
|
}
|
|
}
|