findfile 0.2.8

An ergonomic way to search for files
Documentation
use crate::ast::{Expression, Precedence};
use crate::parse::{LexContext, ParseError, Token};
use crate::play::PlayContext;
use crate::play::PlayResult;
use crate::play::RunContext;
use crate::Value;

#[derive(Debug, Clone, PartialEq)]
pub struct Block(Vec<Expression>);

impl Block {
	pub fn parse_until(lctx: &mut LexContext, end: Token) -> Result<Self, ParseError> {
		let mut args = Vec::new();

		while let Some(expr) = Expression::parse(lctx, true, Precedence::default())? {
			args.push(expr);
			if !lctx.take_if(Token::Semicolon)? {
				break;
			}
		}

		if !lctx.take_if(end)? {
			return Err(ParseError::NoClosingRightParen);
		}

		Ok(Self(args))
	}

	pub fn run(&self, ctx: &mut PlayContext, rctx: RunContext) -> PlayResult<Value> {
		let mut last = None;

		for expr in &self.0 {
			last = Some(expr.run(ctx, rctx)?);
		}

		Ok(last.unwrap_or_default())
	}
}