use std::io;
use std::io::Write;
+use std::process::Command;
use clap::{App, ArgMatches, SubCommand};
use mdbook::MDBook;
use mdbook::errors::Result;
+use mdbook::config;
use get_book_dir;
// Create clap subcommand arguments
pub fn execute(args: &ArgMatches) -> Result<()> {
let book_dir = get_book_dir(args);
let mut builder = MDBook::init(&book_dir);
+ let mut config = config::Config::default();
// If flag `--theme` is present, copy theme to src
if args.is_present("theme") {
+ config.set("output.html.theme", "src/theme")?;
// Skip this if `--force` is present
if !args.is_present("force") {
// Print warning
if confirm() {
builder.copy_theme(true);
}
+ } else {
+ builder.copy_theme(true);
}
}
builder.create_gitignore(true);
}
+ config.book.title = request_book_title();
+
+ if let Some(author) = get_author_name() {
+ debug!("Obtained user name from gitconfig: {:?}", author);
+ config.book.authors.push(author);
+ builder.with_config(config);
+ }
+
builder.build()?;
println!("\nAll done, no errors...");
Ok(())
}
-// Simple function that user comfirmation
+/// Obtains author name from git config file by running the `git config` command.
+fn get_author_name() -> Option<String> {
+ let output = Command::new("git")
+ .args(&["config", "--get", "user.name"])
+ .output()
+ .ok()?;
+
+ if output.status.success() {
+ Some(String::from_utf8_lossy(&output.stdout).trim().to_owned())
+ } else {
+ None
+ }
+}
+
+/// Request book title from user and return if provided.
+fn request_book_title() -> Option<String> {
+ println!("What title would you like to give the book? ");
+ io::stdout().flush().unwrap();
+ let mut resp = String::new();
+ io::stdin().read_line(&mut resp).unwrap();
+ let resp = resp.trim();
+ if resp.is_empty() {
+ None
+ } else {
+ Some(resp.into())
+ }
+}
+
+// Simple function for user confirmation
fn confirm() -> bool {
io::stdout().flush().unwrap();
let mut s = String::new();