r4d 3.2.0-beta.1

Text oriented macro processor
use crate::parser::DefineParser;
use crate::runtime_map::RuntimeMacro;
use crate::{RadError, RadResult};

#[derive(Default)]
pub(crate) struct AnonMap {
    macros: Vec<RuntimeMacro>,
}

impl AnonMap {
    pub fn new() -> Self {
        Self::default()
    }

    pub fn new_macro(&mut self, body: &str) -> RadResult<()> {
        let mut full_body = "anon,".to_string();
        full_body.push_str(body);

        let (_, arg, body) = DefineParser::new()
            .parse_define(&full_body)
            .ok_or_else(|| {
                RadError::InvalidMacroDefinition(
                    "Invalid definition for anonymous macro".to_string(),
                )
            })?;
        let rt_macro = RuntimeMacro::new("anon", &arg, &body, false);
        self.macros.push(rt_macro);
        Ok(())
    }

    pub fn get_anon(&self) -> Option<&RuntimeMacro> {
        self.macros.last()
    }

    pub fn clear(&mut self) {
        self.macros.clear();
    }
}