From b94304405abb1e80c53643bfc254f31afb39ed25 Mon Sep 17 00:00:00 2001 From: Mathieu David Date: Mon, 6 Jul 2015 21:12:24 +0200 Subject: [PATCH] Skeleton for main.rs (binary) --- Cargo.toml | 3 + src/main.rs | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 src/main.rs diff --git a/Cargo.toml b/Cargo.toml index ac84635d..aa3b2217 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,3 +2,6 @@ name = "mdbook" version = "0.0.1" authors = ["Mathieu David "] + +[dependencies] +getopts = "*" diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 00000000..c120250e --- /dev/null +++ b/src/main.rs @@ -0,0 +1,154 @@ +extern crate mdbook; +extern crate getopts; +use std::env; + + +const NAME: &'static str = "mdbook"; +const VERSION: &'static str = "0.0.1"; + +#[derive(Clone)] +struct Subcommand { + name: &'static str, + help: &'static str, + exec: fn(args: Vec) +} + + +// All subcommands +static SUBCOMMANDS: &'static [Subcommand] = &[ + Subcommand{ name: "init", help: " Create boilerplate structure and files in the directory", exec: init }, + Subcommand{ name: "build", help: "Build the book from the markdown files", exec: build }, + Subcommand{ name: "watch", help: "Watch the files for changes", exec: watch }, +]; + + +fn main() { + let args: Vec = env::args().collect(); + let mut subcommand: Option = None; + + if args.len() > 1 { + // Check if one of the subcommands match + for command in SUBCOMMANDS { + if args[1] == command.name { + subcommand = Some(command.clone()); + } + } + } + + match subcommand { + None => no_subcommand(args), + Some(command) => (command.exec)(args), + } + +} + + +fn no_subcommand(args: Vec) { + let mut opts = getopts::Options::new(); + + opts.optflag("h", "help", "display this help and exit"); + opts.optflag("", "version", "output version information and exit"); + + let usage = opts.usage("Create a book in form of a static website from markdown files"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => m, + Err(e) => { + println!("{}", e); + println!("Try `{} --help` for more information", NAME); + return; + }, + }; + + if matches.opt_present("version") { + println!("{} {}", NAME, VERSION); + } else { + if !matches.opt_present("version"){ + print!("Try again, `{0}", NAME); + for index in 1..args.len() { + print!(" {}", args[index]); + } + print!("` is not a valid command... "); + println!("\n"); + } + help(&usage); + } +} + +fn help(usage: &String) { + + println!("{0} {1} \n", NAME, VERSION); + println!("Usage:"); + println!(" {0} [...]\n {0} [options]\n", NAME); + println!("{0}", usage); + println!("Commands:"); + for subcommand in SUBCOMMANDS { + println!(" {0} {1}", subcommand.name, subcommand.help); + } + println!(""); + println!("For more information about a specific command, try `mdbook --help`"); + +} + +fn init(args: Vec) { + let mut opts = getopts::Options::new(); + + opts.optflag("h", "help", "display this help and exit"); + + let usage = opts.usage("Creates a skeleton structure and some boilerplate files to start with"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => m, + Err(e) => { + println!("{}", e); + println!("Try `{} --help` for more information", NAME); + return; + }, + }; + + if matches.opt_present("help") { + println!("{}", usage); + } +} + +fn build(args: Vec) { + let mut opts = getopts::Options::new(); + + opts.optflag("h", "help", "display this help and exit"); + + let usage = opts.usage("Build the book from the markdown files"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => m, + Err(e) => { + println!("{}", e); + println!("Try `{} --help` for more information", NAME); + return; + }, + }; + + if matches.opt_present("help") { + println!("{}", usage); + } +} + +fn watch(args: Vec) { + let mut opts = getopts::Options::new(); + + opts.optflag("h", "help", "display this help and exit"); + + let usage = opts.usage("Watch the files for changes"); + + let matches = match opts.parse(&args[1..]) { + Ok(m) => m, + Err(e) => { + println!("{}", e); + println!("Try `{} --help` for more information", NAME); + return; + }, + }; + + if matches.opt_present("help") { + println!("{}", usage); + } +}