refactor: Change error strategy for future thread use

This commit is contained in:
Ed Page 2019-10-26 20:31:10 -06:00
parent a1a8ba2268
commit 0a2f865d0f
2 changed files with 70 additions and 9 deletions

View file

@ -266,6 +266,27 @@ pub fn init_logging(level: Option<log::Level>) {
} }
} }
fn check_entry(
entry: Result<ignore::DirEntry, ignore::Error>,
args: &Args,
checks: &typos::checks::Checks,
) -> Result<bool, failure::Error> {
let mut typos_found = false;
let entry = entry?;
if entry.file_type().map(|t| t.is_file()).unwrap_or(true) {
let explicit = entry.depth() == 0;
if checks.check_filename(entry.path(), args.format.report())? {
typos_found = true;
}
if checks.check_file(entry.path(), explicit, args.format.report())? {
typos_found = true;
}
}
Ok(typos_found)
}
fn run() -> Result<i32, failure::Error> { fn run() -> Result<i32, failure::Error> {
let args = Args::from_args(); let args = Args::from_args();
@ -279,6 +300,7 @@ fn run() -> Result<i32, failure::Error> {
let config = config; let config = config;
let mut typos_found = false; let mut typos_found = false;
let mut errors_found = false;
for path in args.path.iter() { for path in args.path.iter() {
let path = path.canonicalize()?; let path = path.canonicalize()?;
let cwd = if path.is_file() { let cwd = if path.is_file() {
@ -318,20 +340,21 @@ fn run() -> Result<i32, failure::Error> {
.git_exclude(config.files.ignore_vcs()) .git_exclude(config.files.ignore_vcs())
.parents(config.files.ignore_parent()); .parents(config.files.ignore_parent());
for entry in walk.build() { for entry in walk.build() {
let entry = entry?; match check_entry(entry, &args, &checks) {
if entry.file_type().map(|t| t.is_file()).unwrap_or(true) { Ok(true) => typos_found = true,
let explicit = entry.depth() == 0; Err(err) => {
if checks.check_filename(entry.path(), args.format.report())? { let msg = typos::report::Error::new(err.to_string());
typos_found = true; args.format.report()(msg.into());
} errors_found = true
if checks.check_file(entry.path(), explicit, args.format.report())? {
typos_found = true;
} }
_ => (),
} }
} }
} }
if typos_found { if errors_found {
Ok(2)
} else if typos_found {
Ok(1) Ok(1)
} else { } else {
Ok(0) Ok(0)

View file

@ -8,6 +8,8 @@ pub enum Message<'m> {
BinaryFile(BinaryFile<'m>), BinaryFile(BinaryFile<'m>),
Correction(Correction<'m>), Correction(Correction<'m>),
FilenameCorrection(FilenameCorrection<'m>), FilenameCorrection(FilenameCorrection<'m>),
PathError(PathError<'m>),
Error(Error),
} }
#[derive(Clone, Debug, serde::Serialize, derive_more::Display)] #[derive(Clone, Debug, serde::Serialize, derive_more::Display)]
@ -40,6 +42,30 @@ pub struct FilenameCorrection<'m> {
pub(crate) non_exhaustive: (), pub(crate) non_exhaustive: (),
} }
#[derive(Clone, Debug, serde::Serialize)]
pub struct PathError<'m> {
pub path: &'m std::path::Path,
pub msg: String,
#[serde(skip)]
pub(crate) non_exhaustive: (),
}
#[derive(Clone, Debug, serde::Serialize)]
pub struct Error {
pub msg: String,
#[serde(skip)]
pub(crate) non_exhaustive: (),
}
impl Error {
pub fn new(msg: String) -> Self {
Self {
msg,
non_exhaustive: (),
}
}
}
pub type Report = fn(msg: Message); pub type Report = fn(msg: Message);
pub fn print_silent(_: Message) {} pub fn print_silent(_: Message) {}
@ -62,6 +88,12 @@ pub fn print_brief(msg: Message) {
Message::FilenameCorrection(msg) => { Message::FilenameCorrection(msg) => {
println!("{}: {} -> {}", msg.path.display(), msg.typo, msg.correction); println!("{}: {} -> {}", msg.path.display(), msg.typo, msg.correction);
} }
Message::PathError(msg) => {
println!("{}: {}", msg.path.display(), msg.msg);
}
Message::Error(msg) => {
println!("{}", msg.msg);
}
} }
} }
@ -79,6 +111,12 @@ pub fn print_long(msg: Message) {
msg.correction msg.correction
); );
} }
Message::PathError(msg) => {
println!("{}: {}", msg.path.display(), msg.msg);
}
Message::Error(msg) => {
println!("{}", msg.msg);
}
} }
} }