From a31d0f769a274a4cf2b8ab884d0397bd9eb4f829 Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Wed, 22 Mar 2023 07:35:35 +0000 Subject: [PATCH] nice error message --- src/lib.rs | 35 ++++++++++++++++++++++------------- src/main.rs | 4 ++-- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 20ca087..f9cbb8f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,6 @@ use clap::Parser; -use std::fmt::Debug; +use std::fmt::{Debug, Formatter}; use std::fs; -use std::io; use std::path::PathBuf; #[derive(Parser, Debug)] @@ -27,7 +26,17 @@ pub struct Cli { ignore_extras: bool, } -pub fn skip(cli: &Cli, out: F) -> io::Result<()> +pub struct SkipError(String); + +impl Debug for SkipError { + fn fmt(&self, f: &mut Formatter<'_>) -> core::result::Result<(), std::fmt::Error> { + write!(f, "{}", self.0) + } +} + +pub type Result = core::result::Result; + +pub fn skip(cli: &Cli, out: F) -> Result<()> where F: FnMut(String) -> (), { @@ -41,11 +50,11 @@ where skip_file_lines(cli, out, file) } } - None => todo!("reading from stdin"), + None => Err(SkipError("Not yet implemented - reading from stdin".into())), } } -fn skip_file_lines(cli: &Cli, mut out: F, file: &PathBuf) -> io::Result<()> +fn skip_file_lines(cli: &Cli, mut out: F, file: &PathBuf) -> Result<()> where F: FnMut(String) -> (), { @@ -60,7 +69,7 @@ where Ok(()) } -fn skip_file_lines_matching(cli: &Cli, mut out: F, file: &PathBuf, line: &str) -> io::Result<()> +fn skip_file_lines_matching(cli: &Cli, mut out: F, file: &PathBuf, line: &str) -> Result<()> where F: FnMut(String) -> (), { @@ -77,7 +86,7 @@ where Ok(()) } -fn skip_file_tokens(cli: &Cli, mut out: F, file: &PathBuf, token: &str) -> io::Result<()> +fn skip_file_tokens(cli: &Cli, mut out: F, file: &PathBuf, token: &str) -> Result<()> where F: FnMut(String) -> (), { @@ -105,7 +114,7 @@ mod tests { use super::*; #[test] - fn skip_one_line() -> io::Result<()> { + fn skip_one_line() -> Result<()> { //given let cli = Cli { lines: 1, @@ -125,7 +134,7 @@ mod tests { } #[test] - fn skip_two_lines() -> io::Result<()> { + fn skip_two_lines() -> Result<()> { //given let cli = Cli { lines: 2, @@ -145,7 +154,7 @@ mod tests { } #[test] - fn skip_two_matching_lines() -> io::Result<()> { + fn skip_two_matching_lines() -> Result<()> { //given let cli = Cli { lines: 2, @@ -165,7 +174,7 @@ mod tests { } #[test] - fn skip_three_matching_tokens() -> io::Result<()> { + fn skip_three_matching_tokens() -> Result<()> { //given let cli = Cli { lines: 3, @@ -192,7 +201,7 @@ mod tests { } #[test] - fn skip_three_matching_tokens_include_extras() -> io::Result<()> { + fn skip_three_matching_tokens_include_extras() -> Result<()> { //given let cli = Cli { lines: 4, @@ -224,7 +233,7 @@ mod tests { } #[test] - fn skip_three_matching_tokens_ignore_extras() -> io::Result<()> { + fn skip_three_matching_tokens_ignore_extras() -> Result<()> { //given let cli = Cli { lines: 4, diff --git a/src/main.rs b/src/main.rs index 87913ce..1e0dc80 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,8 @@ use clap::Parser; -use skip::{skip, Cli}; +use skip::{skip, Cli, Result}; use std::io::Write; -fn main() -> std::io::Result<()> { +fn main() -> Result<()> { let cli = Cli::parse(); let stdout = std::io::stdout();