teascade-generator/src/builder.rs

91 lines
3.0 KiB
Rust
Raw Normal View History

2018-04-16 15:58:16 +02:00
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<Config, Error> {
match Config::new() {
Ok(config) => Ok(config),
Err(err) => Err(Error::from(err)),
}
}
fn write_file<T: Into<String>, U: Into<String>>(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(())
}