mdzk 0.3.4

Plain text Zettelkasten based on mdBook
Documentation
use env_logger::Builder;

use mdbook::errors::Error;
use mdzk::{build, init, serve};
use std::io::Write;
use std::path::PathBuf;
use structopt::StructOpt;

#[derive(StructOpt)]
#[structopt(name = "mdzk", about = "A Zettelkasten tool based on mdBook.")]
struct Mdzk {
    #[structopt(subcommand)]
    cmd: Command,

    #[structopt(long = "log-level", short = "l", default_value = "3", help = "Set the logging level")]
    log_level: usize,
}

#[derive(StructOpt)]
enum Command {
    #[structopt(name = "build", about = "Builds an mdzk")]
    Build {
        #[structopt(parse(from_os_str))]
        dir: Option<PathBuf>,

        #[structopt(long = "renderer", short = "r", default_value = "mdbook")]
        renderer: String,
    },

    #[structopt(name = "init", about = "Initializes an mdzk")]
    Init { dir: Option<PathBuf> },

    #[structopt(name = "serve", about = "Serves the generated files")]
    Serve {
        #[structopt(parse(from_os_str))]
        dir: Option<PathBuf>,

        #[structopt(long = "port", short = "p", default_value = "3000")]
        port: i32,

        #[structopt(long = "bind", short = "b", default_value = "localhost")]
        bind: String,
    },
}

fn main() -> Result<(), Error> {
    let args = Mdzk::from_args();

    init_logger(args.log_level);

    match args.cmd {
        Command::Build { dir, renderer } => build(dir, renderer),
        Command::Init { dir } => init(dir),
        Command::Serve { dir, port, bind } => serve(dir, port, bind),
    }
}

fn init_logger(log_level: usize) {
    let mut builder = Builder::new();

    builder.filter(None, match log_level {
        0 => log::LevelFilter::Off,
        1 => log::LevelFilter::Error,
        2 => log::LevelFilter::Warn,
        3 => log::LevelFilter::Info,
        4 => log::LevelFilter::Debug,
        5 => log::LevelFilter::Trace,
        _ => log::LevelFilter::Info,
    });

    builder.format(|formatter, record| {
        writeln!(formatter, "{:8>} - {}", record.level(), record.args())
    });

    builder.init();
}