91 lines
3.0 KiB
Rust
91 lines
3.0 KiB
Rust
|
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(())
|
||
|
}
|