Added command-line options
This commit is contained in:
parent
933189b7b2
commit
9e84a2454d
22
config.toml
22
config.toml
@ -12,17 +12,17 @@ css = []
|
|||||||
#google_robots = "all"
|
#google_robots = "all"
|
||||||
#google_site_verification = ""
|
#google_site_verification = ""
|
||||||
|
|
||||||
#[navbar]
|
[navbar]
|
||||||
#items = ["about", "other", "google"]
|
items = ["about", "other", "google"]
|
||||||
|
|
||||||
# [navbar.item.about]
|
[navbar.item.about]
|
||||||
# title = "About"
|
title = "About"
|
||||||
# link = "/"
|
link = "/"
|
||||||
|
|
||||||
# [navbar.item.other]
|
[navbar.item.other]
|
||||||
# title = "Other"
|
title = "Other"
|
||||||
# link = "/other"
|
link = "/other"
|
||||||
|
|
||||||
# [navbar.item.google]
|
[navbar.item.google]
|
||||||
# title = "Google!"
|
title = "Google!"
|
||||||
# link = "https://google.com"
|
link = "https://google.com"
|
@ -3,6 +3,7 @@ use template::Template;
|
|||||||
use renderer;
|
use renderer;
|
||||||
use logger::{LogLevel, Logger};
|
use logger::{LogLevel, Logger};
|
||||||
use error::Error;
|
use error::Error;
|
||||||
|
use options::BuildOps;
|
||||||
|
|
||||||
use std::fs::{create_dir_all, File};
|
use std::fs::{create_dir_all, File};
|
||||||
use std::io::prelude::*;
|
use std::io::prelude::*;
|
||||||
@ -20,7 +21,11 @@ fn fetch_config() -> Result<Config, Error> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_file<T: Into<String>, U: Into<String>>(path_str: T, content: U) -> Result<(), Error> {
|
fn write_file<T: Into<String>, U: Into<String>>(
|
||||||
|
path_str: T,
|
||||||
|
content: U,
|
||||||
|
overwrite: bool,
|
||||||
|
) -> Result<(), Error> {
|
||||||
let path_str = path_str.into();
|
let path_str = path_str.into();
|
||||||
let content = content.into();
|
let content = content.into();
|
||||||
|
|
||||||
@ -35,7 +40,7 @@ fn write_file<T: Into<String>, U: Into<String>>(path_str: T, content: U) -> Resu
|
|||||||
format!("Could not find parent folder or file name for {}", path_str),
|
format!("Could not find parent folder or file name for {}", path_str),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
if path.exists() {
|
if path.exists() && !overwrite {
|
||||||
Err(Error::new(
|
Err(Error::new(
|
||||||
LogLevel::SEVERE,
|
LogLevel::SEVERE,
|
||||||
format!(
|
format!(
|
||||||
@ -51,14 +56,14 @@ fn write_file<T: Into<String>, U: Into<String>>(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");
|
logger.log(LogLevel::INFO, "Starting build");
|
||||||
let config = fetch_config()?;
|
let config = fetch_config()?;
|
||||||
|
|
||||||
if config.global_config.website.use_default_css {
|
if config.global_config.website.use_default_css {
|
||||||
let css_path = "css/default.css";
|
let css_path = "css/default.css";
|
||||||
logger.log(LogLevel::DETAIL, format!("Adding public/{}", css_path));
|
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");
|
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;
|
let html_path = config.clone().page_config.page.html_path;
|
||||||
logger.log(LogLevel::DETAILER, format!("Writing public/{}", html_path));
|
logger.log(LogLevel::DETAILER, format!("Writing public/{}", html_path));
|
||||||
if let Some(render) = renders.get(idx) {
|
if let Some(render) = renders.get(idx) {
|
||||||
write_file(html_path, render.clone())?;
|
write_file(html_path, render.clone(), ops.overwrite)?;
|
||||||
} else {
|
} else {
|
||||||
return Err(Error::new(
|
return Err(Error::new(
|
||||||
LogLevel::SEVERE,
|
LogLevel::SEVERE,
|
||||||
|
@ -10,6 +10,7 @@ impl Logger {
|
|||||||
pub fn log<T: Into<String>>(&self, log_level: LogLevel, message: T) {
|
pub fn log<T: Into<String>>(&self, log_level: LogLevel, message: T) {
|
||||||
if self.log_level.clone() as i32 >= log_level.clone() as i32 {
|
if self.log_level.clone() as i32 >= log_level.clone() as i32 {
|
||||||
match log_level {
|
match log_level {
|
||||||
|
LogLevel::QUIET => (),
|
||||||
LogLevel::SEVERE => eprintln!("[SEVERE]: {}", message.into()),
|
LogLevel::SEVERE => eprintln!("[SEVERE]: {}", message.into()),
|
||||||
LogLevel::INFO => println!("[INFO]: {}", message.into()),
|
LogLevel::INFO => println!("[INFO]: {}", message.into()),
|
||||||
LogLevel::WARNING => eprintln!("[WARNING]: {}", message.into()),
|
LogLevel::WARNING => eprintln!("[WARNING]: {}", message.into()),
|
||||||
@ -22,10 +23,25 @@ impl Logger {
|
|||||||
|
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
|
#[repr(u8)]
|
||||||
pub enum LogLevel {
|
pub enum LogLevel {
|
||||||
SEVERE = 0,
|
QUIET = 0,
|
||||||
INFO = 1,
|
SEVERE = 1,
|
||||||
WARNING = 2, // Default
|
INFO = 2,
|
||||||
DETAIL = 3,
|
WARNING = 3, // Default
|
||||||
DETAILER = 4,
|
DETAIL = 4,
|
||||||
|
DETAILER = 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u8> 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
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
26
src/main.rs
26
src/main.rs
@ -2,9 +2,12 @@ extern crate pulldown_cmark;
|
|||||||
extern crate regex;
|
extern crate regex;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate serde_derive;
|
extern crate serde_derive;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate structopt;
|
||||||
extern crate toml;
|
extern crate toml;
|
||||||
|
|
||||||
mod logger;
|
mod logger;
|
||||||
|
mod options;
|
||||||
mod error;
|
mod error;
|
||||||
mod config_toml;
|
mod config_toml;
|
||||||
mod config;
|
mod config;
|
||||||
@ -12,16 +15,25 @@ mod template;
|
|||||||
mod renderer;
|
mod renderer;
|
||||||
mod builder;
|
mod builder;
|
||||||
|
|
||||||
|
use structopt::StructOpt;
|
||||||
|
|
||||||
use logger::{LogLevel, Logger};
|
use logger::{LogLevel, Logger};
|
||||||
|
use options::{Opt, Subcommands};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let logger = Logger::new(LogLevel::DETAILER);
|
let opt = Opt::from_args();
|
||||||
|
|
||||||
match builder::build(&logger) {
|
let log_level = (3 - opt.quiet as i8 + opt.verbose as i8).max(0).min(5);
|
||||||
Ok(_) => logger.log(LogLevel::DETAILER, "Building finished successfully."),
|
let logger = Logger::new(LogLevel::from(log_level as u8));
|
||||||
Err(err) => {
|
|
||||||
logger.log(err.severity(), err.description());
|
match opt.cmd {
|
||||||
logger.log(LogLevel::SEVERE, "Aborting building due to error.");
|
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!"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
src/options.rs
Normal file
32
src/options.rs
Normal file
@ -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,
|
||||||
|
}
|
@ -1,2 +1,5 @@
|
|||||||
# OTher
|
# OTher
|
||||||
This page is not like the others
|
This page is not like the others
|
||||||
|
|
||||||
|
Example stuff that makes this site different:
|
||||||
|
- This list
|
Loading…
Reference in New Issue
Block a user