X-Git-Url: http://git.scottworley.com/tablify/blobdiff_plain/fdc441dab9c793956ea5c6e4a7c766eb87b16588..HEAD:/src/lib.rs diff --git a/src/lib.rs b/src/lib.rs index 731457e..e199470 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -5,9 +5,14 @@ use std::io::BufRead; use std::iter::Iterator; fn tally_marks(n: usize, mark: Option<&str>) -> String { - let fives = { 0..n / 5 }.map(|_| '𝍸'); - let ones = { 0..n % 5 }.map(|_| '𝍷'); - fives.chain(ones).collect() + match mark { + None => { + let fives = { 0..n / 5 }.map(|_| '𝍸'); + let ones = { 0..n % 5 }.map(|_| '𝍷'); + fives.chain(ones).collect() + } + Some(m) => { 0..n }.map(|_| m).collect(), + } } #[derive(PartialEq, Eq, Debug)] @@ -45,6 +50,16 @@ impl Config { .substitute_labels .insert(col.to_owned(), label.to_owned()), }; + } else if let Some(directive) = cmd.strip_prefix("mark ") { + match directive.split_once(':') { + None => { + return Err(std::io::Error::new( + std::io::ErrorKind::InvalidInput, + format!("line {line_num}: Mark missing ':'"), + )) + } + Some((col, label)) => self.mark.insert(col.to_owned(), label.to_owned()), + }; } else { return Err(std::io::Error::new( std::io::ErrorKind::InvalidInput, @@ -502,6 +517,11 @@ mod tests { assert_eq!(tally_marks(9, None), "𝍸𝍷𝍷𝍷𝍷"); assert_eq!(tally_marks(10, None), "𝍸𝍸"); assert_eq!(tally_marks(11, None), "𝍸𝍸𝍷"); + assert_eq!(tally_marks(1, Some("x")), "x"); + assert_eq!(tally_marks(4, Some("x")), "xxxx"); + assert_eq!(tally_marks(5, Some("x")), "xxxxx"); + assert_eq!(tally_marks(6, Some("x")), "xxxxxx"); + assert_eq!(tally_marks(2, Some("🍔")), "🍔🍔"); } fn read_rows(input: impl std::io::Read) -> Result, std::io::Error> { @@ -631,6 +651,7 @@ mod tests { .substitute_labels["foo"], "bar" ); + assert_eq!(read_config(&b"!mark foo:*"[..]).unwrap().mark["foo"], "*"); let bad_command = read_config(&b"!no such command"[..]); assert!(bad_command.is_err()); @@ -643,6 +664,10 @@ mod tests { let bad_sub = read_config(&b"!label foo"[..]); assert!(bad_sub.is_err()); assert!(format!("{bad_sub:?}").contains("line 1: Annotation missing ':'")); + + let bad_mark = read_config(&b"!mark foo"[..]); + assert!(bad_mark.is_err()); + assert!(format!("{bad_mark:?}").contains("line 1: Mark missing ':'")); } #[test] @@ -821,6 +846,26 @@ mod tests { r#"𝍷"# ) ); + assert_eq!( + render_cell( + &Config { + column_threshold: 2, + static_columns: vec![], + hidden_columns: HashSet::new(), + substitute_labels: HashMap::new(), + mark: HashMap::from([("foo".to_owned(), "🦄".to_owned())]), + }, + "foo", + &mut Row { + label: "nope".to_owned(), + entries: HashMap::from([("foo".to_owned(), vec![None])]), + } + ), + HTML::from( + r#"🦄"# + ) + ); + let mut r = Row { label: "nope".to_owned(), entries: HashMap::from([ @@ -891,6 +936,22 @@ mod tests { ), HTML::from("") ); + assert_eq!( + render_all_leftovers( + &Config { + column_threshold: 2, + static_columns: vec![], + hidden_columns: HashSet::new(), + substitute_labels: HashMap::new(), + mark: HashMap::from([("foo".to_owned(), "🌈".to_owned())]), + }, + &Row { + label: "nope".to_owned(), + entries: HashMap::from([("foo".to_owned(), vec![None, None])]), + } + ), + HTML::from("foo: 🌈🌈") + ); } #[test]