twig 0.1.0

Twig templating engine for Rust; work in progress.
Documentation
use instructions::{ CompileExpression, CompiledExpression };
use nodes::expr::{ Expr, ExprValue };
use value::Value;
use error::TemplateResult;
use mold::Staging;

impl<'c> CompileExpression<'c> for Expr<'c> {
    fn compile<'r>(&'r self, stage: &'r mut Staging<'c, Value>) -> TemplateResult<CompiledExpression> {
        trace!("Expr::compile");
        Ok(match self.value {
            ExprValue::Constant(_) => unreachable!("ExprValue::Constant::compile"),
            ExprValue::Name(name) => {
                let maybe_mem = stage.use_name(name);

                let name_mem = match maybe_mem {
                    Some(mem) => {
                        trace!("use mem {:?} for name {:?}", mem, name);
                        mem
                    },
                    None => {
                        stage.include_const(Value::Str(name.into()))
                    }
                };

                CompiledExpression::with_result("ExprValue::Name", name_mem)
            },
            ExprValue::AssignName(_) => unreachable!("ExprValue::AssignName::compile"),
            ExprValue::Array(_) => unreachable!("ExprValue::Array::compile"),
            ExprValue::Hash(_) => unreachable!("ExprValue::Hash::compile"),
            ExprValue::UnaryOperator { .. } => unreachable!("ExprValue::UnaryOperator::compile"),
            ExprValue::BinaryOperator { .. } => unreachable!("ExprValue::UnaryOperator::compile"),
            ExprValue::Concat { .. } => unreachable!("ExprValue::Concat::compile"),
            ExprValue::Conditional { .. } => unreachable!("ExprValue::Conditional::compile"),
            ExprValue::GetAttr { .. } => unreachable!("ExprValue::GetAttr::compile"),
            ExprValue::ImportedFunctionCall { .. } => unreachable!("ExprValue::ImportedFunctionCall::compile"),
            ExprValue::FunctionCall { name, ref arguments } => {
                CompiledExpression::empty("function call")
            },
        })
    }
}