extern crate ansi_term; extern crate pathdiff; extern crate pulldown_cmark; extern crate regex; #[macro_use] extern crate serde_derive; #[macro_use] extern crate structopt; extern crate toml; mod logger; mod options; mod error; mod config_toml; mod config; mod template; mod renderer; mod builder; mod new_page; mod file_writer; use std::collections::HashMap; use std::error::Error; use std::path::PathBuf; use structopt::StructOpt; use logger::{LogLevel, Logger}; use options::{Opt, Subcommands}; use config_toml::{GlobalConfigToml, NavbarConfig, NavbarItem, WebsiteConfig}; fn main() { let opt = Opt::from_args(); let log_level = (3 - opt.quiet as i8 + opt.verbose as i8).max(0).min(5); let logger = Logger::new(LogLevel::from(log_level as u8)); match opt.cmd { Subcommands::Build(ops) => match builder::build(&logger, &ops) { Ok(_) => logger.log(LogLevel::DETAILER, "Building finished successfully."), Err(err) => { logger.log(err.severity(), err.description()); logger.log(LogLevel::SEVERE, "Aborting building due to error."); } }, Subcommands::New(ops) => match new_page::generate_new_page(ops, &logger) { Ok(_) => logger.log( LogLevel::DETAILER, "Generating the new page finished successfully.", ), Err(err) => { logger.log(err.severity(), err.description()); logger.log(LogLevel::SEVERE, "Aborting building due to error."); } }, Subcommands::Initialize(ops) => { logger.log(LogLevel::DETAIL, "Generating config.toml"); let mut navbar = None; if !ops.no_default_navbar { let mut hashmap = HashMap::new(); hashmap.insert( "test".to_owned(), NavbarItem { title: "Home".to_owned(), link: "/home.html".to_owned(), image_url: Some("/img/image.png".to_owned()), }, ); hashmap.insert( "other".to_owned(), NavbarItem { title: "Other".to_owned(), link: "/other.html".to_owned(), image_url: None, }, ); navbar = Some(NavbarConfig { items: vec!["test".to_owned(), "other".to_owned()], item_map: hashmap, }) } let config = GlobalConfigToml { website: WebsiteConfig { website_name: ops.name, built_pages: Vec::new(), use_default_css: true, javascript: Vec::new(), css: Vec::new(), favicon: ops.favicon, before_navbar_url: None, before_content_url: None, after_content_url: None, twitter_author: ops.twitter_author, google_robots: None, google_site_verification: None, }, navbar: navbar, }; match toml::ser::to_string(&config) { Ok(text) => { match file_writer::write_file(PathBuf::from("config.toml"), text, ops.overwrite) { Ok(_) => logger.log(LogLevel::INFO, "config.toml successfully generated"), Err(err) => logger.log( LogLevel::SEVERE, format!( "Failed to write config.toml: {}", err.description().to_owned() ), ), } } Err(err) => logger.log( LogLevel::SEVERE, format!( "Failed to serialize config.toml: {}", err.description().to_owned() ), ), } } } }