twig 0.1.0

Twig templating engine for Rust; work in progress.
Documentation
use std::convert::From;
use std::fmt;
use error::{ ExtensionError, Location, At, TemplateError };

#[derive(Debug, Clone)]
pub enum CoreTemplateError {
    OnlyVariablesCanBeAssignedTo,
    ExpectedEndmacroName { expected: String, given: String },
    CanNotAssignTo(String),
}

impl CoreTemplateError {
    pub fn at(self, line: usize) -> At<CoreTemplateError> {
        At::new(self, Location::new(line))
    }
}

impl ExtensionError for CoreTemplateError {
    fn boxed_clone(&self) -> Box<ExtensionError> {
        Box::new(self.clone())
    }
}

impl fmt::Display for CoreTemplateError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match *self {
            CoreTemplateError::OnlyVariablesCanBeAssignedTo => write!(f, "Only variables can be assigned to"),
            CoreTemplateError::ExpectedEndmacroName { ref expected, ref given } => write!(f, "Expected endmacro for macro \"{}\" (but \"{}\" given)", expected, given),
            CoreTemplateError::CanNotAssignTo(ref v) => write!(f, "You cannot assign a value to \"{}\"", v),
        }
    }
}

impl From<At<CoreTemplateError>> for At<TemplateError> {
    fn from(At { loc: Location { line }, err }: At<CoreTemplateError>) -> At<TemplateError> {
        TemplateError::CustomError(Box::new(err))
            .at(line)
    }
}