use serde_json::{Map, Value};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BaselineSite {
pub path: &'static [&'static str],
pub analysis: Option<&'static str>,
}
pub const BASELINE_STALENESS_SITES: &[BaselineSite] = &[
BaselineSite {
path: &["baseline_staleness"],
analysis: None,
},
BaselineSite {
path: &["summary", "baseline_staleness"],
analysis: None,
},
BaselineSite {
path: &["check", "baseline_staleness"],
analysis: Some("dead-code"),
},
BaselineSite {
path: &["dupes", "baseline_staleness"],
analysis: Some("duplication"),
},
BaselineSite {
path: &["health", "summary", "baseline_staleness"],
analysis: Some("health"),
},
BaselineSite {
path: &["dead_code", "baseline_staleness"],
analysis: Some("dead-code"),
},
BaselineSite {
path: &["duplication", "baseline_staleness"],
analysis: Some("duplication"),
},
BaselineSite {
path: &["complexity", "summary", "baseline_staleness"],
analysis: Some("complexity"),
},
];
#[must_use]
pub fn lookup<'a>(root: &'a Map<String, Value>, path: &[&str]) -> Option<&'a Value> {
let (first, rest) = path.split_first()?;
let mut current = root.get(*first)?;
for key in rest {
current = current.get(key)?;
}
Some(current)
}
pub fn baseline_staleness_objects(
root: &Map<String, Value>,
) -> impl Iterator<Item = (&Value, Option<&'static str>)> {
BASELINE_STALENESS_SITES
.iter()
.filter_map(move |site| Some((lookup(root, site.path)?, site.analysis)))
}
#[cfg(test)]
mod tests {
use super::{BASELINE_STALENESS_SITES, baseline_staleness_objects, lookup};
#[test]
fn every_site_has_a_distinct_path() {
let mut paths = BASELINE_STALENESS_SITES
.iter()
.map(|site| site.path)
.collect::<Vec<_>>();
let total = paths.len();
paths.sort_unstable();
paths.dedup();
assert_eq!(paths.len(), total, "a duplicated site would report twice");
}
#[test]
fn every_site_path_ends_at_the_staleness_key() {
for site in BASELINE_STALENESS_SITES {
assert_eq!(site.path.last(), Some(&"baseline_staleness"));
}
}
#[test]
fn a_missing_segment_resolves_to_nothing() {
let envelope = serde_json::json!({ "summary": { "score": 90 } });
let root = envelope.as_object().expect("object");
assert!(lookup(root, &["summary", "baseline_staleness"]).is_none());
assert!(lookup(root, &["check", "baseline_staleness"]).is_none());
assert_eq!(baseline_staleness_objects(root).count(), 0);
}
#[test]
fn a_multi_section_envelope_reports_each_baseline_with_its_own_label() {
let envelope = serde_json::json!({
"kind": "audit",
"dead_code": { "baseline_staleness": { "baseline_entries": 3 } },
"duplication": { "baseline_staleness": { "baseline_entries": 4 } },
"complexity": { "summary": { "baseline_staleness": { "baseline_entries": 5 } } }
});
let root = envelope.as_object().expect("object");
let found = baseline_staleness_objects(root)
.map(|(staleness, analysis)| (staleness["baseline_entries"].as_u64(), analysis))
.collect::<Vec<_>>();
assert_eq!(
found,
vec![
(Some(3), Some("dead-code")),
(Some(4), Some("duplication")),
(Some(5), Some("complexity")),
]
);
}
}