#![recursion_limit = "1024"]
#![warn(
warnings,
rust_2018_idioms,
clippy::all,
clippy::complexity,
clippy::correctness,
clippy::pedantic,
clippy::perf,
clippy::style,
clippy::restriction
)]
#![allow(
clippy::float_arithmetic,
clippy::implicit_return,
clippy::filter_map,
clippy::wildcard_imports,
clippy::integer_arithmetic
)]
#[macro_use]
extern crate error_chain;
use std::convert::TryInto;
mod errors;
use log::trace;
use structopt::StructOpt;
mod app;
mod cache;
mod gitignore;
mod helpers;
mod template;
#[allow(clippy::result_expect_used, clippy::exit, clippy::use_debug)]
fn main() {
let opts = app::CliOpts::from_args();
let verbosity = opts
.boilerplate
.verbose
.saturating_add(app::DEFAULT_VERBOSITY)
.saturating_sub(opts.boilerplate.quiet);
stderrlog::new()
.module(module_path!())
.quiet(verbosity == 0)
.verbosity(verbosity.saturating_sub(1).try_into().expect("should never even come close"))
.timestamp(opts.boilerplate.timestamp.unwrap_or(stderrlog::Timestamp::Off))
.init()
.expect("initializing logging output");
trace!("Initialized logging, {} v{}", env!("CARGO_PKG_NAME"), env!("CARGO_PKG_VERSION"));
trace!("Starting with application");
if let Err(ref e) = app::main(opts) {
use std::io::prelude::*;
let stderr = std::io::stderr();
let mut lock = stderr.lock();
writeln!(lock, "error: {}", e).expect("error while writing error");
for e in e.iter().skip(1) {
writeln!(lock, "caused by: {}", e).expect("error while writing error");
}
if let Some(backtrace) = e.backtrace() {
writeln!(lock, "backtrace: {:?}", backtrace).expect("error while writing error");
}
std::process::exit(1);
}
}