limonite 0.1.0

small blog generator
Documentation
use std::path::Path;
use std::collections::HashMap;
use std::fs;
use layout::Layout;

#[derive(Debug)]
pub struct LayoutStore {
    layouts: HashMap<String, Layout>
}

impl<'a> LayoutStore {
    pub fn new(layout_dir: &Path) -> LayoutStore {
        let mut layouts: HashMap<String, Layout> = HashMap::new();
        for entry in fs::read_dir(&layout_dir).unwrap() {
            let layout_path = entry.unwrap().path();
            let fname = layout_path.file_name().unwrap().to_str().unwrap();
            if !fname.starts_with(".") && fname.ends_with("html") {
                let layout = Layout::new(&layout_path);
                layouts.insert(layout.name(), layout);
            }
        }
        LayoutStore {
            layouts: layouts
        }
    }

    pub fn render(&self, layout_name: &'a str, content: String, context: HashMap<String, String>) -> String {
        let layout = self.layouts.get(layout_name).unwrap();
        let data = HashMap::new();
        let mut buffer = layout.render(content, data);
        match layout.layout() {
            Some(l) => {
                buffer = self.render(&l, buffer, HashMap::new());
            },
            None => {}
        }
        buffer
    }
}

#[test]
fn renders_recursive_layout() {
    let layout_store = LayoutStore::new(Path::new("fixtures/004/_layouts"));
    let post_content = layout_store.render("post", "Post Body".to_owned(), HashMap::new());
    assert_eq!(post_content, "Main\n\nPost\nPost Body\n".to_owned());
}