1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
pub mod loggerv;
pub mod prelude {
pub use std::io::{stdin, stdout, Read, Write, BufReader, BufRead, BufWriter};
pub use std::fs::File;
pub use problem::prelude::*;
pub use structopt::StructOpt;
pub use std::fmt::{self, Display, Debug};
pub use log::{self, trace, debug, info, warn, error, log_enabled};
pub use boolinator::Boolinator;
pub use itertools::*;
pub use tap::*;
pub use crate::loggerv;
#[derive(Debug, StructOpt)]
pub struct LoggingOpt {
#[structopt(short = "v", long = "verbose", parse(from_occurrences))]
pub verbose: u8,
#[structopt(long = "errors-only")]
pub errors_only: bool,
#[structopt(long = "force-colors")]
pub force_colors: bool,
}
#[derive(Debug, StructOpt)]
pub struct DryRunOpt {
#[structopt(long = "dry-run",short = "-d")]
pub enabled: bool,
}
impl DryRunOpt {
pub fn run(&self, msg: impl Display, run: impl FnOnce() -> ()) -> () {
if self.enabled {
info!("[dry run]: {}", msg);
} else {
info!("{}", msg);
run()
}
}
}
pub fn read_stdin() -> String {
let mut buffer = String::new();
stdin().read_to_string(&mut buffer).or_failed_to("read UTF-8 string from stdin");
buffer
}
pub fn init_logger(args: &LoggingOpt, module_paths: impl IntoIterator<Item = impl Into<String>>) {
use log::Level;
use loggerv::{Logger, Output};
let (base_level, verbose) = if args.errors_only {
(Level::Error, 0)
} else {
(Level::Warn, args.verbose)
};
let mut logger = Logger::new()
.base_level(base_level)
.verbosity(verbose as u64)
.output(&Level::Info, Output::Stderr)
.output(&Level::Debug, Output::Stderr)
.output(&Level::Trace, Output::Stderr)
.module_path(false);
if verbose <= 3 {
logger = logger
.add_module_path_filter("cotton")
.add_module_path_filter("problem");
logger = module_paths.into_iter().fold(logger, |logger, module_path|
logger.add_module_path_filter(module_path)
);
}
if args.force_colors {
logger = logger
.force_colors()
}
logger.level(true)
.init()
.or_failed_to("init logger");
::problem::format_panic_to_error_log();
}
}