spikes 0.3.2

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

use crate::error::Result;
use crate::output::{print_hotspots_table, print_json};
use crate::spike::SpikeType;
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 {
        if spike.spike_type == SpikeType::Element {
            if let Some(selector) = spike.selector {
                *counts.entry(selector).or_insert(0) += 1;
            }
        }
    }

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

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

    Ok(())
}