use config::Config; use template::Template; use renderer; use logger::{LogLevel, Logger}; use error::Error; use std::fs::{create_dir_all, File}; use std::io::prelude::*; use std::path::Path; const DEFAULT_CSS: &'static str = include_str!("templates/default-css.css"); const PAGE_TEMPLATE: &'static str = include_str!("templates/page-template.html"); const NAVBAR_ITEM: &'static str = include_str!("templates/navbar/item-template.html"); const NAVBAR_IMAGE_ITEM: &'static str = include_str!("templates/navbar/image-item-template.html"); fn fetch_config() -> Result { match Config::new() { Ok(config) => Ok(config), Err(err) => Err(Error::from(err)), } } fn write_file, U: Into>(path_str: T, content: U) -> Result<(), Error> { let path_str = path_str.into(); let content = content.into(); let path = Path::new(&path_str); if let Some(parent) = path.parent() { create_dir_all(parent)?; } else { return Err(Error::new( LogLevel::SEVERE, format!("Could not find parent folder for {}", path_str), )); } if path.exists() { Err(Error::new( LogLevel::SEVERE, format!( "File already exists: {} -- Consider using overwrite-flag", path_str ), )) } else { match File::create(path) { Ok(mut file) => Ok(file.write_all(content.as_bytes()).unwrap()), Err(err) => Err(Error::from(err)), } } } pub fn build(logger: &Logger) -> Result<(), Error> { logger.log(LogLevel::INFO, "Starting build"); let config = fetch_config()?; if config.global_config.website.use_default_css { logger.log(LogLevel::DETAIL, "Adding public/css/default.css"); write_file("public/css/default.css", DEFAULT_CSS)?; } logger.log(LogLevel::INFO, "Generating page templates"); let page_template = Template::new(PAGE_TEMPLATE); let mut navbar_content = String::new(); if config.global_config.navbar.is_some() { let navbar_item_template = Template::new(NAVBAR_ITEM); let navbar_image_item_template = Template::new(NAVBAR_IMAGE_ITEM); logger.log(LogLevel::DETAIL, "Rendering Navbar"); navbar_content = renderer::render_navbar(&config, navbar_item_template, navbar_image_item_template)?; } logger.log(LogLevel::INFO, "Rendering"); logger.log(LogLevel::DETAILER, "Rendering public/test.html"); let rendered = match config.get_configs_for(0) { Ok(page_config) => page_template.render(&Template::page_data_from( page_config.clone(), navbar_content, renderer::render_markdown_content(&page_config).unwrap(), )), Err(err) => panic!(err), }; logger.log(LogLevel::INFO, "Writing"); logger.log(LogLevel::DETAILER, "Writing public/test.html"); write_file("public/test.html", rendered)?; logger.log(LogLevel::INFO, "Done!"); Ok(()) }