use crate::core::environment::RunSignal;
use crate::core::exec::ExecOutcome;
use crate::core::Element;
use crate::error::{Result, TemplateError};
pub struct Sep {
pub body: Vec<Element>,
}
impl Sep {
pub fn new(body: Vec<Element>) -> Self {
Sep { body }
}
pub(crate) fn exec(&self, env: &mut crate::core::Environment) -> Result<ExecOutcome> {
exec_sep(env, &self.body)
}
}
fn exec_sep(env: &mut crate::core::Environment, body: &[Element]) -> Result<ExecOutcome> {
let lc = env
.get_loop_context(None)
.ok_or_else(|| TemplateError::misc("#sep without iteration in context"))?;
if !lc.borrow().has_next {
return Ok(ExecOutcome::Done);
}
match env.run(body) {
Ok(RunSignal::Completed) => Ok(ExecOutcome::Done),
Ok(RunSignal::Returned(v)) => Ok(ExecOutcome::ReturnValue(v)),
Err(e) => Err(e),
}
}