2018-04-30 11:09:24 +02:00
|
|
|
// `error_chain!` can recurse deeply
|
|
|
|
#![recursion_limit = "1024"]
|
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
extern crate error_chain;
|
|
|
|
|
|
|
|
#[macro_use]
|
|
|
|
extern crate clap;
|
|
|
|
|
2018-04-30 15:08:04 +02:00
|
|
|
#[macro_use]
|
|
|
|
extern crate lazy_static;
|
|
|
|
|
2018-04-21 12:51:43 +02:00
|
|
|
extern crate ansi_term;
|
|
|
|
extern crate atty;
|
|
|
|
extern crate console;
|
2018-04-30 15:08:04 +02:00
|
|
|
extern crate directories;
|
2018-04-21 17:12:25 +02:00
|
|
|
extern crate git2;
|
2018-04-21 12:51:43 +02:00
|
|
|
extern crate syntect;
|
|
|
|
|
2018-05-10 23:39:13 +02:00
|
|
|
mod app;
|
2018-05-10 12:36:09 +02:00
|
|
|
mod assets;
|
2018-05-15 17:45:58 -07:00
|
|
|
mod decorations;
|
2018-05-10 12:36:09 +02:00
|
|
|
mod diff;
|
2018-05-21 21:51:41 +02:00
|
|
|
mod features;
|
2018-08-22 22:29:12 +02:00
|
|
|
mod line_range;
|
2018-05-21 14:59:42 +02:00
|
|
|
mod output;
|
2018-05-07 01:32:00 +02:00
|
|
|
mod printer;
|
2018-05-11 02:32:31 +02:00
|
|
|
mod style;
|
2018-04-23 23:56:47 +02:00
|
|
|
mod terminal;
|
|
|
|
|
2018-05-21 21:51:41 +02:00
|
|
|
use std::io;
|
2018-05-16 21:22:16 +02:00
|
|
|
use std::path::Path;
|
2018-05-21 14:59:42 +02:00
|
|
|
use std::process;
|
2018-04-21 12:51:43 +02:00
|
|
|
|
2018-05-21 14:59:42 +02:00
|
|
|
use app::App;
|
2018-05-21 22:29:03 +02:00
|
|
|
use assets::{clear_assets, config_dir, HighlightingAssets};
|
2018-08-22 22:29:12 +02:00
|
|
|
use features::{list_languages, list_themes, print_files};
|
2018-04-23 23:56:47 +02:00
|
|
|
|
2018-04-30 11:09:24 +02:00
|
|
|
mod errors {
|
2018-05-03 20:34:23 +02:00
|
|
|
error_chain! {
|
2018-04-30 11:09:24 +02:00
|
|
|
foreign_links {
|
2018-05-09 21:09:01 +02:00
|
|
|
Clap(::clap::Error);
|
2018-04-30 11:09:24 +02:00
|
|
|
Io(::std::io::Error);
|
2018-05-25 22:12:30 +02:00
|
|
|
SyntectError(::syntect::LoadingError);
|
2018-06-04 17:07:01 -06:00
|
|
|
ParseIntError(::std::num::ParseIntError);
|
2018-04-30 11:09:24 +02:00
|
|
|
}
|
|
|
|
}
|
2018-04-21 12:51:43 +02:00
|
|
|
|
2018-05-21 21:51:41 +02:00
|
|
|
pub fn handle_error(error: &Error) {
|
|
|
|
match error {
|
|
|
|
&Error(ErrorKind::Io(ref io_error), _)
|
|
|
|
if io_error.kind() == super::io::ErrorKind::BrokenPipe =>
|
|
|
|
{
|
|
|
|
super::process::exit(0);
|
|
|
|
}
|
|
|
|
_ => {
|
|
|
|
use ansi_term::Colour::Red;
|
|
|
|
eprintln!("{}: {}", Red.paint("[bat error]"), error);
|
|
|
|
}
|
|
|
|
};
|
2018-04-21 12:51:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-05-21 21:51:41 +02:00
|
|
|
use errors::*;
|
|
|
|
|
2018-08-22 22:29:12 +02:00
|
|
|
fn run_cache_subcommand(matches: &clap::ArgMatches) -> Result<()> {
|
|
|
|
if matches.is_present("init") {
|
|
|
|
let source_dir = matches.value_of("source").map(Path::new);
|
|
|
|
let target_dir = matches.value_of("target").map(Path::new);
|
|
|
|
|
|
|
|
let blank = matches.is_present("blank");
|
|
|
|
|
|
|
|
let assets = HighlightingAssets::from_files(source_dir, blank)?;
|
|
|
|
assets.save(target_dir)?;
|
|
|
|
} else if matches.is_present("clear") {
|
|
|
|
clear_assets();
|
|
|
|
} else if matches.is_present("config-dir") {
|
|
|
|
println!("{}", config_dir());
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2018-05-19 11:46:41 +02:00
|
|
|
/// Returns `Err(..)` upon fatal errors. Otherwise, returns `Some(true)` on full success and
|
2018-05-21 21:51:41 +02:00
|
|
|
/// `Some(false)` if any intermediate errors occurred (were printed).
|
2018-05-19 11:46:41 +02:00
|
|
|
fn run() -> Result<bool> {
|
2018-05-10 23:39:13 +02:00
|
|
|
let app = App::new();
|
2018-04-21 12:51:43 +02:00
|
|
|
|
2018-05-10 23:39:13 +02:00
|
|
|
match app.matches.subcommand() {
|
2018-05-08 19:48:10 +02:00
|
|
|
("cache", Some(cache_matches)) => {
|
2018-08-22 22:29:12 +02:00
|
|
|
run_cache_subcommand(cache_matches)?;
|
|
|
|
Ok(true)
|
2018-04-30 15:08:04 +02:00
|
|
|
}
|
|
|
|
_ => {
|
2018-05-10 23:39:13 +02:00
|
|
|
let config = app.config()?;
|
2018-05-10 12:36:09 +02:00
|
|
|
let assets = HighlightingAssets::new();
|
2018-04-30 15:08:04 +02:00
|
|
|
|
2018-05-10 23:39:13 +02:00
|
|
|
if app.matches.is_present("list-languages") {
|
2018-05-21 21:51:41 +02:00
|
|
|
list_languages(&assets, config.term_width);
|
2018-05-07 09:25:47 -07:00
|
|
|
|
2018-08-22 22:29:12 +02:00
|
|
|
Ok(true)
|
|
|
|
} else if app.matches.is_present("list-themes") {
|
|
|
|
list_themes(&assets);
|
2018-05-11 19:53:17 +08:00
|
|
|
|
2018-08-22 22:29:12 +02:00
|
|
|
Ok(true)
|
|
|
|
} else {
|
2018-08-23 19:43:10 +02:00
|
|
|
if config.loop_through {
|
|
|
|
// TODO
|
|
|
|
print_files(&assets, &config)
|
|
|
|
} else {
|
|
|
|
print_files(&assets, &config)
|
|
|
|
}
|
2018-08-22 22:29:12 +02:00
|
|
|
}
|
2018-04-30 15:08:04 +02:00
|
|
|
}
|
|
|
|
}
|
2018-05-19 11:46:41 +02:00
|
|
|
}
|
2018-04-30 15:08:04 +02:00
|
|
|
|
|
|
|
fn main() {
|
|
|
|
let result = run();
|
2018-04-21 12:51:43 +02:00
|
|
|
|
2018-05-19 11:46:41 +02:00
|
|
|
match result {
|
|
|
|
Err(error) => {
|
|
|
|
handle_error(&error);
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
Ok(false) => {
|
|
|
|
process::exit(1);
|
|
|
|
}
|
|
|
|
Ok(true) => {
|
|
|
|
process::exit(0);
|
|
|
|
}
|
2018-04-21 12:51:43 +02:00
|
|
|
}
|
|
|
|
}
|