From 7a1fac7fabed6f039f3d81d99bcdcc7189eabac5 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Wed, 11 Nov 2020 12:19:22 -0600 Subject: [PATCH] refactor(report): Use native types --- crates/typos/src/checks.rs | 18 +++++++-------- crates/typos/src/report.rs | 45 +++++++++++++++++++++++--------------- src/replace.rs | 12 +++++----- 3 files changed, 42 insertions(+), 33 deletions(-) diff --git a/crates/typos/src/checks.rs b/crates/typos/src/checks.rs index 56a689d..922fc9d 100644 --- a/crates/typos/src/checks.rs +++ b/crates/typos/src/checks.rs @@ -94,7 +94,7 @@ struct ReportContext<'m, 'r> { impl<'m, 'r> report::Report for ReportContext<'m, 'r> { fn report(&self, msg: report::Message) -> bool { - let msg = msg.context(self.context.clone()); + let msg = msg.context(Some(self.context.clone())); self.reporter.report(msg) } } @@ -188,7 +188,7 @@ impl Check for Typos { Some(corrections) => { let byte_offset = ident.offset(); let msg = report::Typo { - context: report::Context::None, + context: None, buffer: std::borrow::Cow::Borrowed(buffer.as_bytes()), byte_offset, typo: ident.token(), @@ -203,7 +203,7 @@ impl Check for Typos { Some(corrections) => { let byte_offset = word.offset(); let msg = report::Typo { - context: report::Context::None, + context: None, buffer: std::borrow::Cow::Borrowed(buffer.as_bytes()), byte_offset, typo: word.token(), @@ -236,7 +236,7 @@ impl Check for Typos { Some(corrections) => { let byte_offset = ident.offset(); let msg = report::Typo { - context: report::Context::None, + context: None, buffer: std::borrow::Cow::Borrowed(buffer), byte_offset, typo: ident.token(), @@ -251,7 +251,7 @@ impl Check for Typos { Some(corrections) => { let byte_offset = word.offset(); let msg = report::Typo { - context: report::Context::None, + context: None, buffer: std::borrow::Cow::Borrowed(buffer), byte_offset, typo: word.token(), @@ -300,7 +300,7 @@ impl Check for ParseIdentifiers { let typos_found = false; let msg = report::Parse { - context: report::Context::None, + context: None, kind: report::ParseKind::Identifier, data: parser.parse_str(buffer).map(|i| i.token()).collect(), }; @@ -321,7 +321,7 @@ impl Check for ParseIdentifiers { let typos_found = false; let msg = report::Parse { - context: report::Context::None, + context: None, kind: report::ParseKind::Identifier, data: parser.parse_bytes(buffer).map(|i| i.token()).collect(), }; @@ -363,7 +363,7 @@ impl Check for ParseWords { let typos_found = false; let msg = report::Parse { - context: report::Context::None, + context: None, kind: report::ParseKind::Word, data: parser .parse_str(buffer) @@ -387,7 +387,7 @@ impl Check for ParseWords { let typos_found = false; let msg = report::Parse { - context: report::Context::None, + context: None, kind: report::ParseKind::Word, data: parser .parse_bytes(buffer) diff --git a/crates/typos/src/report.rs b/crates/typos/src/report.rs index a1386ca..bd45753 100644 --- a/crates/typos/src/report.rs +++ b/crates/typos/src/report.rs @@ -39,7 +39,7 @@ impl<'m> Message<'m> { } } - pub fn context(self, context: Context<'m>) -> Self { + pub fn context(self, context: Option>) -> Self { match self { Message::Typo(typo) => { let typo = typo.context(context); @@ -65,7 +65,7 @@ pub struct BinaryFile<'m> { #[non_exhaustive] pub struct Typo<'m> { #[serde(flatten)] - pub context: Context<'m>, + pub context: Option>, #[serde(skip)] pub buffer: Cow<'m, [u8]>, pub byte_offset: usize, @@ -76,7 +76,7 @@ pub struct Typo<'m> { impl<'m> Default for Typo<'m> { fn default() -> Self { Self { - context: Context::None, + context: None, buffer: Cow::Borrowed(&[]), byte_offset: 0, typo: "", @@ -91,13 +91,6 @@ impl<'m> Default for Typo<'m> { pub enum Context<'m> { File(FileContext<'m>), Path(PathContext<'m>), - None, -} - -impl<'m> Default for Context<'m> { - fn default() -> Self { - Context::None - } } impl<'m> std::fmt::Display for Context<'m> { @@ -105,7 +98,6 @@ impl<'m> std::fmt::Display for Context<'m> { match self { Context::File(c) => write!(f, "{}:{}", c.path.display(), c.line_num), Context::Path(c) => write!(f, "{}", c.path.display()), - Context::None => Ok(()), } } } @@ -172,7 +164,7 @@ impl<'m> Default for File<'m> { #[non_exhaustive] pub struct Parse<'m> { #[serde(flatten)] - pub context: Context<'m>, + pub context: Option>, pub kind: ParseKind, pub data: Vec<&'m str>, } @@ -180,7 +172,7 @@ pub struct Parse<'m> { impl<'m> Default for Parse<'m> { fn default() -> Self { Self { - context: Context::None, + context: None, kind: ParseKind::Identifier, data: vec![], } @@ -294,13 +286,15 @@ fn print_brief_correction(msg: &Typo) { crate::Status::Invalid => { println!( "{}:{}: {} is disallowed", - msg.context, msg.byte_offset, msg.typo, + context_display(&msg.context), + msg.byte_offset, + msg.typo, ); } crate::Status::Corrections(corrections) => { println!( "{}:{}: {} -> {}", - msg.context, + context_display(&msg.context), msg.byte_offset, msg.typo, itertools::join(corrections.iter(), ", ") @@ -318,7 +312,9 @@ fn print_long_correction(msg: &Typo) { writeln!( handle, "{}:{}: {} is disallowed", - msg.context, msg.byte_offset, msg.typo, + context_display(&msg.context), + msg.byte_offset, + msg.typo, ) .unwrap(); } @@ -332,9 +328,15 @@ fn print_long_correction(msg: &Typo) { .unwrap(); } } - writeln!(handle, " --> {}:{}", msg.context, msg.byte_offset).unwrap(); + writeln!( + handle, + " --> {}:{}", + context_display(&msg.context), + msg.byte_offset + ) + .unwrap(); - if let Context::File(context) = &msg.context { + if let Some(Context::File(context)) = &msg.context { let line_num = context.line_num.to_string(); let line_indent: String = itertools::repeat_n(" ", line_num.len()).collect(); @@ -350,6 +352,13 @@ fn print_long_correction(msg: &Typo) { } } +fn context_display<'c>(context: &'c Option>) -> &'c dyn std::fmt::Display { + context + .as_ref() + .map(|c| c as &dyn std::fmt::Display) + .unwrap_or(&"") +} + #[derive(Copy, Clone, Debug)] pub struct PrintJson; diff --git a/src/replace.rs b/src/replace.rs index 22a6376..ae1f101 100644 --- a/src/replace.rs +++ b/src/replace.rs @@ -67,7 +67,7 @@ impl<'r> typos::report::Report for Replace<'r> { }; match &typo.context { - typos::report::Context::File(file) => { + Some(typos::report::Context::File(file)) => { let path = file.path.to_owned(); let line_num = file.line_num; let correction = @@ -82,7 +82,7 @@ impl<'r> typos::report::Report for Replace<'r> { content.push(correction); false } - typos::report::Context::Path(path) => { + Some(typos::report::Context::Path(path)) => { let path = path.path.to_owned(); let correction = Correction::new(typo.byte_offset, typo.typo, corrections[0].as_ref()); @@ -209,12 +209,12 @@ mod test { let replace = Replace::new(&primary); replace.report( typos::report::Typo::default() - .context( + .context(Some( typos::report::FileContext::default() .path(input_file.path()) .line_num(1) .into(), - ) + )) .buffer(std::borrow::Cow::Borrowed(b"1 foo 2\n3 4 5")) .byte_offset(2) .typo("foo") @@ -238,11 +238,11 @@ mod test { let replace = Replace::new(&primary); replace.report( typos::report::Typo::default() - .context( + .context(Some( typos::report::PathContext::default() .path(input_file.path()) .into(), - ) + )) .buffer(std::borrow::Cow::Borrowed(b"foo.txt")) .byte_offset(0) .typo("foo")