From 9e84a2454d056c7744415dec189eaca2d6df3fee Mon Sep 17 00:00:00 2001 From: Teascade Date: Mon, 16 Apr 2018 19:31:38 +0300 Subject: [PATCH] Added command-line options --- config.toml | 22 +++++++++++----------- src/builder.rs | 15 ++++++++++----- src/logger.rs | 26 +++++++++++++++++++++----- src/main.rs | 26 +++++++++++++++++++------- src/options.rs | 32 ++++++++++++++++++++++++++++++++ test_page/other.md | 5 ++++- 6 files changed, 97 insertions(+), 29 deletions(-) create mode 100644 src/options.rs diff --git a/config.toml b/config.toml index 3557bef..7906670 100644 --- a/config.toml +++ b/config.toml @@ -12,17 +12,17 @@ css = [] #google_robots = "all" #google_site_verification = "" -#[navbar] -#items = ["about", "other", "google"] +[navbar] +items = ["about", "other", "google"] -# [navbar.item.about] -# title = "About" -# link = "/" + [navbar.item.about] + title = "About" + link = "/" -# [navbar.item.other] -# title = "Other" -# link = "/other" + [navbar.item.other] + title = "Other" + link = "/other" -# [navbar.item.google] -# title = "Google!" -# link = "https://google.com" \ No newline at end of file + [navbar.item.google] + title = "Google!" + link = "https://google.com" \ No newline at end of file diff --git a/src/builder.rs b/src/builder.rs index 217328f..22eb502 100644 --- a/src/builder.rs +++ b/src/builder.rs @@ -3,6 +3,7 @@ use template::Template; use renderer; use logger::{LogLevel, Logger}; use error::Error; +use options::BuildOps; use std::fs::{create_dir_all, File}; use std::io::prelude::*; @@ -20,7 +21,11 @@ fn fetch_config() -> Result { } } -fn write_file, U: Into>(path_str: T, content: U) -> Result<(), Error> { +fn write_file, U: Into>( + path_str: T, + content: U, + overwrite: bool, +) -> Result<(), Error> { let path_str = path_str.into(); let content = content.into(); @@ -35,7 +40,7 @@ fn write_file, U: Into>(path_str: T, content: U) -> Resu format!("Could not find parent folder or file name for {}", path_str), )); } - if path.exists() { + if path.exists() && !overwrite { Err(Error::new( LogLevel::SEVERE, format!( @@ -51,14 +56,14 @@ fn write_file, U: Into>(path_str: T, content: U) -> Resu } } -pub fn build(logger: &Logger) -> Result<(), Error> { +pub fn build(logger: &Logger, ops: &BuildOps) -> Result<(), Error> { logger.log(LogLevel::INFO, "Starting build"); let config = fetch_config()?; if config.global_config.website.use_default_css { let css_path = "css/default.css"; logger.log(LogLevel::DETAIL, format!("Adding public/{}", css_path)); - write_file(css_path, DEFAULT_CSS)?; + write_file(css_path, DEFAULT_CSS, ops.overwrite)?; } logger.log(LogLevel::INFO, "Generating page templates"); @@ -92,7 +97,7 @@ pub fn build(logger: &Logger) -> Result<(), Error> { let html_path = config.clone().page_config.page.html_path; logger.log(LogLevel::DETAILER, format!("Writing public/{}", html_path)); if let Some(render) = renders.get(idx) { - write_file(html_path, render.clone())?; + write_file(html_path, render.clone(), ops.overwrite)?; } else { return Err(Error::new( LogLevel::SEVERE, diff --git a/src/logger.rs b/src/logger.rs index eada2a9..74a3661 100644 --- a/src/logger.rs +++ b/src/logger.rs @@ -10,6 +10,7 @@ impl Logger { pub fn log>(&self, log_level: LogLevel, message: T) { if self.log_level.clone() as i32 >= log_level.clone() as i32 { match log_level { + LogLevel::QUIET => (), LogLevel::SEVERE => eprintln!("[SEVERE]: {}", message.into()), LogLevel::INFO => println!("[INFO]: {}", message.into()), LogLevel::WARNING => eprintln!("[WARNING]: {}", message.into()), @@ -22,10 +23,25 @@ impl Logger { #[allow(dead_code)] #[derive(Clone)] +#[repr(u8)] pub enum LogLevel { - SEVERE = 0, - INFO = 1, - WARNING = 2, // Default - DETAIL = 3, - DETAILER = 4, + QUIET = 0, + SEVERE = 1, + INFO = 2, + WARNING = 3, // Default + DETAIL = 4, + DETAILER = 5, +} + +impl From for LogLevel { + fn from(number: u8) -> LogLevel { + match number { + 0 => LogLevel::QUIET, + 1 => LogLevel::SEVERE, + 2 => LogLevel::INFO, + 4 => LogLevel::DETAIL, + 5 => LogLevel::DETAILER, + _ => LogLevel::WARNING, // 3, also fallback + } + } } diff --git a/src/main.rs b/src/main.rs index c9b6e15..03eb082 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,9 +2,12 @@ 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; @@ -12,16 +15,25 @@ mod template; mod renderer; mod builder; +use structopt::StructOpt; + use logger::{LogLevel, Logger}; +use options::{Opt, Subcommands}; fn main() { - let logger = Logger::new(LogLevel::DETAILER); + let opt = Opt::from_args(); - match builder::build(&logger) { - 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."); - } + 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(build) => match builder::build(&logger, &build) { + 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::NewPage => println!("Unsupported!"), } } diff --git a/src/options.rs b/src/options.rs new file mode 100644 index 0000000..5ab69f1 --- /dev/null +++ b/src/options.rs @@ -0,0 +1,32 @@ +#[derive(StructOpt, Debug)] +#[structopt(name = "Teasca.de Generator", + about = "A website generator, used mainly for generating teasca.de")] +pub struct Opt { + /// Verbose flag, makes the program more noisy. (-vv for maximum noisiness) + #[structopt(short = "v", long = "verbose", parse(from_occurrences))] + pub verbose: u8, + + /// Quiet flag, makes the program less noisy. (-qqq for minimum noisiness) + #[structopt(short = "q", long = "quiet", parse(from_occurrences))] + pub quiet: u8, + + #[structopt(subcommand)] + pub cmd: Subcommands, +} + +#[derive(StructOpt, Debug)] +pub enum Subcommands { + /// Build the website + #[structopt(name = "build")] + Build(BuildOps), + /// Create a new page + #[structopt(name = "new-page")] + NewPage, +} + +#[derive(StructOpt, Debug)] +pub struct BuildOps { + /// Overwrites necessary files to create new ones. + #[structopt(short = "o", long = "overwrite")] + pub overwrite: bool, +} diff --git a/test_page/other.md b/test_page/other.md index a979280..1d242e1 100644 --- a/test_page/other.md +++ b/test_page/other.md @@ -1,2 +1,5 @@ # OTher -This page is not like the others \ No newline at end of file +This page is not like the others + +Example stuff that makes this site different: +- This list \ No newline at end of file