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
    }
}
