From 89a87698ed39188fee792cc3488bffed2ff525cf Mon Sep 17 00:00:00 2001 From: Melody Horn Date: Sat, 3 Apr 2021 12:26:33 -0600 Subject: implement `eval` --- src/makefile/functions.rs | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) (limited to 'src/makefile/functions.rs') diff --git a/src/makefile/functions.rs b/src/makefile/functions.rs index 43ed44b..a22ec3b 100644 --- a/src/makefile/functions.rs +++ b/src/makefile/functions.rs @@ -1,10 +1,18 @@ +use std::cell::RefCell; +use std::rc::Rc; + use eyre::{bail, Result}; use super::pattern::r#match; use super::r#macro::{Set as MacroSet, Source as MacroSource}; use super::token::TokenString; -pub fn expand_call(name: &str, args: &[TokenString], macros: &MacroSet) -> Result { +pub fn expand_call( + name: &str, + args: &[TokenString], + macros: &MacroSet, + to_eval: Option>>>, +) -> Result { match name { "filter" => { assert_eq!(args.len(), 2); @@ -54,7 +62,16 @@ pub fn expand_call(name: &str, args: &[TokenString], macros: &MacroSet) -> Resul } // eval - "eval" => todo!(), + "eval" => { + assert_eq!(args.len(), 1); + let should_eval = eval::eval(macros, &args[0])?; + if let Some(to_eval) = to_eval { + to_eval.borrow_mut().push(should_eval); + } else { + bail!("tried to eval something but no eval back-channel was available"); + } + return Ok(String::new()); + } "origin" => { assert_eq!(args.len(), 1); @@ -268,6 +285,14 @@ mod call { } } +mod eval { + use super::*; + + pub fn eval(macros: &MacroSet, arg: &TokenString) -> Result { + macros.expand(arg) + } +} + mod origin { use super::*; @@ -317,7 +342,7 @@ mod test { type R = Result<()>; fn call(name: &str, args: &[TokenString], macros: &MacroSet) -> Result { - super::expand_call(name, args, macros) + super::expand_call(name, args, macros, None) } macro_rules! call { -- cgit v1.2.3