package org.jtwig.parser.parboiled.node;
import org.jtwig.model.tree.OutputNode;
import org.jtwig.parser.parboiled.ParserContext;
import org.jtwig.parser.parboiled.base.LimitsParser;
import org.jtwig.parser.parboiled.base.PositionTrackerParser;
import org.jtwig.parser.parboiled.base.SpacingParser;
import org.jtwig.parser.parboiled.expression.AnyExpressionParser;
import org.parboiled.Rule;
public class OutputNodeParser extends NodeParser<OutputNode> {
public OutputNodeParser(ParserContext context) {
super(OutputNodeParser.class, context);
}
@Override
public Rule NodeRule() {
PositionTrackerParser positionTrackerParser = parserContext().parser(PositionTrackerParser.class);
LimitsParser limitsParser = parserContext().parser(LimitsParser.class);
SpacingParser spacingParser = parserContext().parser(SpacingParser.class);
AnyExpressionParser anyExpressionParser = parserContext().parser(AnyExpressionParser.class);
return Sequence(
positionTrackerParser.PushPosition(),
limitsParser.startOutput(),
spacingParser.Spacing(),
Mandatory(anyExpressionParser.ExpressionRule(), "Missing or invalid output expression"),
spacingParser.Spacing(),
Mandatory(limitsParser.endOutput(), "Expecting end of output code island"),
push(new OutputNode(
positionTrackerParser.pop(1),
anyExpressionParser.pop()
))
);
}
}