diff options
Diffstat (limited to 'src/makefile/eval_context.rs')
| -rw-r--r-- | src/makefile/eval_context.rs | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/src/makefile/eval_context.rs b/src/makefile/eval_context.rs new file mode 100644 index 0000000..06f4fbf --- /dev/null +++ b/src/makefile/eval_context.rs @@ -0,0 +1,52 @@ +use eyre::{Result, WrapErr}; +use std::io::{BufRead, Cursor}; +use std::rc::Rc; + +use crate::makefile::input::FinishedMakefileReader; +use crate::makefile::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 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_macros = self.parent.macros.with_overlay(); +        let child = MakefileReader::read( +            self.parent.args, +            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() +    } +} |