rusche 0.2.4

A lightweight Scheme interpreter embeddable in Rust applications
Documentation
use rusche::{
    eval::{eval, EvalContext, Evaluator},
    lexer::tokenize,
    parser::Parser,
};

pub trait EvalToStr {
    fn eval_to_str(&self, src: &str) -> String;
}

impl EvalToStr for EvalContext {
    fn eval_to_str(&self, src: &str) -> String {
        let tokens = tokenize(src, None).expect(&format!("Failed to tokenize: {}", src));
        let mut parser = Parser::with_tokens(tokens);
        let Some(expr) = parser
            .parse()
            .expect(&format!("Failed to parse an expression: {}", src))
        else {
            panic!("No expression parsed from: {}", src);
        };

        match eval(&expr, self) {
            Ok(result) => result.to_string(),
            Err(error) => format!("Err: {error}"),
        }
    }
}

impl EvalToStr for Evaluator {
    fn eval_to_str(&self, src: &str) -> String {
        self.context().eval_to_str(src)
    }
}