diff options
Diffstat (limited to 'src/makefile/eval_context.rs')
-rw-r--r-- | src/makefile/eval_context.rs | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/makefile/eval_context.rs b/src/makefile/eval_context.rs new file mode 100644 index 0000000..87edafd --- /dev/null +++ b/src/makefile/eval_context.rs @@ -0,0 +1,53 @@ +use eyre::{Result, WrapErr}; +use std::io::{BufRead, Cursor}; +use std::rc::Rc; + +use super::{FinishedMakefileReader, MacroSet, MakefileReader}; + +pub struct DeferredEvalContext<'parent, 'args, 'grandparent, R: BufRead> { + parent: &'parent MakefileReader<'args, 'grandparent, R>, + children: Vec<FinishedMakefileReader>, +} + +impl<'parent, 'args, 'grandparent, R: BufRead> + DeferredEvalContext<'parent, 'args, 'grandparent, R> +{ + pub const fn new(parent: &'parent MakefileReader<'args, 'grandparent, R>) -> Self { + Self { + parent, + children: Vec::new(), + } + } + + pub fn push(&mut self, child: FinishedMakefileReader) { + self.children.push(child); + } + + pub fn eval(&mut self, to_eval: String) -> Result<()> { + let child_stack = self.parent.stack.with_scope(&self.parent.macros); + let child_macros = MacroSet::new(); + let child = MakefileReader::read( + self.parent.args, + child_stack, + child_macros, + Cursor::new(to_eval), + "<eval>", + Rc::clone(&self.parent.file_names), + ) + .context("while evaling")? + .finish(); + self.push(child); + Ok(()) + } +} + +impl<'parent, 'args, 'grandparent, R: BufRead> IntoIterator + for DeferredEvalContext<'parent, 'args, 'grandparent, R> +{ + type Item = FinishedMakefileReader; + type IntoIter = std::vec::IntoIter<Self::Item>; + + fn into_iter(self) -> Self::IntoIter { + self.children.into_iter() + } +} |