From 12e913005080a9f60750d807c220a58704429361 Mon Sep 17 00:00:00 2001 From: Scott Worley Date: Wed, 2 Oct 2024 02:25:40 -0700 Subject: [PATCH] Make read_rows() strict (not lazy) --- src/lib.rs | 60 ++++++++++++++++-------------------------------------- 1 file changed, 18 insertions(+), 42 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index fbadb2a..dbcfc7b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -170,8 +170,8 @@ impl>> Iterator for Reader } } -fn read_rows(input: impl std::io::Read) -> impl Iterator> { - Reader::new(std::io::BufReader::new(input).lines()) +fn read_rows(input: impl std::io::Read) -> Result, std::io::Error> { + Reader::new(std::io::BufReader::new(input).lines()).collect::, _>>() } fn column_counts(rows: &[Rowlike]) -> Vec<(usize, String)> { @@ -304,7 +304,7 @@ fn render_column_headers(columns: &[String]) -> HTML { /// * the log has invalid syntax: /// * an indented line with no preceding non-indented line pub fn tablify(config: &Config, input: impl std::io::Read) -> Result { - let rows = read_rows(input).collect::, _>>()?; + let rows = read_rows(input)?; let columns = column_order(config, &rows); Ok(HTML(format!( "{HEADER}{}{}{FOOTER}", @@ -351,21 +351,21 @@ mod tests { #[test] fn test_read_rows() { assert_eq!( - read_rows(&b"foo"[..]).flatten().collect::>(), + read_rows(&b"foo"[..]).unwrap(), vec![Rowlike::Row(Row { label: "foo".to_owned(), entries: HashMap::new(), })] ); assert_eq!( - read_rows(&b"bar"[..]).flatten().collect::>(), + read_rows(&b"bar"[..]).unwrap(), vec![Rowlike::Row(Row { label: "bar".to_owned(), entries: HashMap::new(), })] ); assert_eq!( - read_rows(&b"foo\nbar\n"[..]).flatten().collect::>(), + read_rows(&b"foo\nbar\n"[..]).unwrap(), vec![ Rowlike::Row(Row { label: "foo".to_owned(), @@ -378,16 +378,14 @@ mod tests { ] ); assert_eq!( - read_rows(&b"foo\n bar\n"[..]).flatten().collect::>(), + read_rows(&b"foo\n bar\n"[..]).unwrap(), vec![Rowlike::Row(Row { label: "foo".to_owned(), entries: HashMap::from([("bar".to_owned(), vec![None])]), })] ); assert_eq!( - read_rows(&b"foo\n bar\n baz\n"[..]) - .flatten() - .collect::>(), + read_rows(&b"foo\n bar\n baz\n"[..]).unwrap(), vec![Rowlike::Row(Row { label: "foo".to_owned(), entries: HashMap::from([ @@ -397,9 +395,7 @@ mod tests { })] ); assert_eq!( - read_rows(&b"foo\n\nbar\n"[..]) - .flatten() - .collect::>(), + read_rows(&b"foo\n\nbar\n"[..]).unwrap(), vec![ Rowlike::Row(Row { label: "foo".to_owned(), @@ -412,9 +408,7 @@ mod tests { ] ); assert_eq!( - read_rows(&b"foo\n\n\nbar\n"[..]) - .flatten() - .collect::>(), + read_rows(&b"foo\n\n\nbar\n"[..]).unwrap(), vec![ Rowlike::Row(Row { label: "foo".to_owned(), @@ -428,9 +422,7 @@ mod tests { ] ); assert_eq!( - read_rows(&b"foo\n \nbar\n"[..]) - .flatten() - .collect::>(), + read_rows(&b"foo\n \nbar\n"[..]).unwrap(), vec![ Rowlike::Row(Row { label: "foo".to_owned(), @@ -443,20 +435,18 @@ mod tests { ] ); assert_eq!( - read_rows(&b"foo \n bar \n"[..]) - .flatten() - .collect::>(), + read_rows(&b"foo \n bar \n"[..]).unwrap(), vec![Rowlike::Row(Row { label: "foo".to_owned(), entries: HashMap::from([("bar".to_owned(), vec![None])]), })] ); - let bad = read_rows(&b" foo"[..]).next().unwrap(); + let bad = read_rows(&b" foo"[..]); assert!(bad.is_err()); assert!(format!("{bad:?}").contains("1: Entry with no header")); - let bad2 = read_rows(&b"foo\n\n bar"[..]).nth(1).unwrap(); + let bad2 = read_rows(&b"foo\n\n bar"[..]); assert!(bad2.is_err()); assert!(format!("{bad2:?}").contains("3: Entry with no header")); } @@ -464,34 +454,20 @@ mod tests { #[test] fn test_column_counts() { assert_eq!( - column_counts( - &read_rows(&b"foo\n bar\n baz\n"[..]) - .collect::, _>>() - .unwrap() - ), + column_counts(&read_rows(&b"foo\n bar\n baz\n"[..]).unwrap()), vec![(1, String::from("bar")), (1, String::from("baz"))] ); assert_eq!( - column_counts( - &read_rows(&b"foo\n bar\n baz\nquux\n baz"[..]) - .collect::, _>>() - .unwrap() - ), + column_counts(&read_rows(&b"foo\n bar\n baz\nquux\n baz"[..]).unwrap()), vec![(2, String::from("baz")), (1, String::from("bar"))] ); assert_eq!( - column_counts( - &read_rows(&b"foo\n bar\n bar\n baz\n bar\nquux\n baz"[..]) - .collect::, _>>() - .unwrap() - ), + column_counts(&read_rows(&b"foo\n bar\n bar\n baz\n bar\nquux\n baz"[..]).unwrap()), vec![(2, String::from("baz")), (1, String::from("bar"))] ); assert_eq!( column_counts( - &read_rows(&b"foo\n bar: 1\n bar: 2\n baz\n bar\nquux\n baz"[..]) - .collect::, _>>() - .unwrap() + &read_rows(&b"foo\n bar: 1\n bar: 2\n baz\n bar\nquux\n baz"[..]).unwrap() ), vec![(2, String::from("baz")), (1, String::from("bar"))] ); -- 2.44.1