#[derive(Debug, PartialEq, Eq, Hash)]
struct Entry {
col: String,
- instance: String,
+ instance: Option<String>,
}
impl From<&str> for Entry {
fn from(value: &str) -> Entry {
- Entry {
- col: String::from(value),
- instance: String::from(""),
+ match value.split_once(':') {
+ None => Entry {
+ col: String::from(value),
+ instance: None,
+ },
+ Some((col, instance)) => Entry {
+ col: String::from(col.trim()),
+ instance: Some(String::from(instance.trim())),
+ },
}
}
}
fn column_counts(rows: &[RowInput]) -> Vec<(usize, String)> {
let mut counts: Vec<_> = rows
.iter()
- .flat_map(|r| r.entries.iter().collect::<HashSet<_>>().into_iter())
- .fold(HashMap::new(), |mut cs, e| {
- cs.entry(String::from(&e.col))
+ .flat_map(|r| {
+ r.entries
+ .iter()
+ .map(|e| &e.col)
+ .collect::<HashSet<_>>()
+ .into_iter()
+ })
+ .fold(HashMap::new(), |mut cs, col| {
+ cs.entry(String::from(col))
.and_modify(|n| *n += 1)
.or_insert(1);
cs
mod tests {
use super::*;
+ #[test]
+ fn test_parse_entry() {
+ assert_eq!(
+ Entry::from("foo"),
+ Entry {
+ col: String::from("foo"),
+ instance: None
+ }
+ );
+ assert_eq!(
+ Entry::from("foo:bar"),
+ Entry {
+ col: String::from("foo"),
+ instance: Some(String::from("bar"))
+ }
+ );
+ assert_eq!(
+ Entry::from("foo: bar"),
+ Entry {
+ col: String::from("foo"),
+ instance: Some(String::from("bar"))
+ }
+ );
+ }
+
#[test]
fn test_read_rows() {
assert_eq!(
),
vec![(1, String::from("bar")), (2, String::from("baz"))]
);
+ assert_eq!(
+ column_counts(
+ &read_rows(&b"foo\n bar: 1\n bar: 2\n baz\n bar\nquux\n baz"[..])
+ .collect::<Result<Vec<_>, _>>()
+ .unwrap()
+ ),
+ vec![(1, String::from("bar")), (2, String::from("baz"))]
+ );
}
}