twig 0.1.0

Twig templating engine for Rust; work in progress.
Documentation
use tokens::{ TokenRef, TokenValueRef };
use nodes::{ Parser, TokenParserExtension };
use nodes::body::{ Body, ImportTarget };
use error::TemplateResult;

use nodes::expr_parser::parse_expression;

pub struct From;

impl From {
    pub fn new() -> From {
        From
    }
}

impl TokenParserExtension for From {
    fn parse<'p, 'c>(&self, parser: &mut Parser<'p, 'c>, token: TokenRef<'c>)
        -> TemplateResult<Option<Body<'c>>>
    {
        trace!("From::parse {:?}", token);

        let macro_expr = try!(parse_expression(parser, 0));

        try!(parser.expect(TokenValueRef::Name("import")));

        let mut targets = Vec::new();
        loop {
            let name = try!(parser.expect_name());
            let mut alias = name;
            if try!(parser.skip_to_next_if(TokenValueRef::Name("as"))) {
                alias = try!(parser.expect_name());
            }
            targets.push((alias, name));
            if !try!(parser.skip_to_next_if(TokenValueRef::Punctuation(','))) {
                break;
            }
        }
        try!(parser.expect(TokenValueRef::BlockEnd));

        let mut target_slots = Vec::new();
        for (alias, name) in targets {
            target_slots.push(
                (
                    parser.add_imported_function(alias, name),
                    alias,
                    ImportTarget::Function { symbol: name }
                )
            );
        }

        Ok(Some(Body::Import {
            source: Box::new(macro_expr),
            targets: target_slots,
            line: token.line,
        }))
    }

    fn get_tag(&self) -> &'static str {
        "from"
    }
}