spikes 0.4.0

Drop-in feedback collection for static HTML mockups
use std::collections::HashMap;

use crate::error::Result;
use crate::output::{print_json, print_reviewers_table};
use crate::storage::load_spikes;

pub fn run(json: bool) -> Result<()> {
    let spikes = load_spikes()?;

    let mut counts: HashMap<String, usize> = HashMap::new();
    for spike in spikes {
        *counts.entry(spike.reviewer.name).or_insert(0) += 1;
    }

    let mut reviewers: Vec<(String, usize)> = counts.into_iter().collect();
    reviewers.sort_by_key(|item| std::cmp::Reverse(item.1));

    if json {
        let output: Vec<serde_json::Value> = reviewers
            .iter()
            .map(|(name, count)| {
                serde_json::json!({
                    "name": name,
                    "count": count
                })
            })
            .collect();
        print_json(&output);
    } else {
        print_reviewers_table(&reviewers);
    }

    Ok(())
}