report.rs

2.9 kB · rust · 95 lines

1use crate::model::{Cross, Manifest, Source};2use std::collections::BTreeMap;34pub fn skip_lines(m: &Manifest) -> Vec<String> {5    m.functions6        .iter()7        .filter(|f| f.source != Source::NamedEnum)8        .filter_map(|f| match &f.cross {9            Cross::Skip { reason } => Some(format!("{} {reason}", f.path)),10            _ => None,11        })12        .collect()13}1415pub fn check_skip(m: &Manifest, skip_txt: &str) -> Vec<String> {16    let mut errors = vec![];17    let skipped: Vec<&str> = m18        .functions19        .iter()20        .filter(|f| f.source != Source::NamedEnum && matches!(f.cross, Cross::Skip { .. }))21        .map(|f| f.path.as_str())22        .collect();23    let listed: Vec<&str> = skip_txt24        .lines()25        .filter_map(|l| l.split_whitespace().next())26        .collect();27    for path in &skipped {28        if !listed.contains(path) {29            errors.push(format!("skip.txt is missing {path}"));30        }31    }32    for path in &listed {33        if !skipped.contains(path) {34            errors.push(format!("skip.txt names nothing: {path}"));35        }36    }37    errors.sort();38    errors.dedup();39    errors40}4142pub fn summary(m: &Manifest, macro_body_fns: usize) -> Vec<String> {43    let mut counts: BTreeMap<String, [usize; 3]> = BTreeMap::new();44    for f in &m.functions {45        let unit = f.module.split("::").next().unwrap_or_default().to_string();46        let slot = counts.entry(unit).or_default();47        match f.cross {48            Cross::Ok => slot[0] += 1,49            Cross::Skip { .. } => slot[1] += 1,50            Cross::Private => slot[2] += 1,51        }52    }53    let mut lines: Vec<String> = counts54        .iter()55        .map(|(unit, [ok, skip, private])| {56            format!("{unit}: ok {ok}, skip {skip}, private {private}")57        })58        .collect();59    let total: [usize; 3] = counts60        .values()61        .fold([0; 3], |a, b| [a[0] + b[0], a[1] + b[1], a[2] + b[2]]);62    let written = m63        .functions64        .iter()65        .filter(|f| f.source == Source::Written && !f.constant)66        .count();67    let constant = m68        .functions69        .iter()70        .filter(|f| f.source == Source::Written && f.constant)71        .count();72    let generated = m73        .functions74        .iter()75        .filter(|f| f.source == Source::NamedEnum)76        .count();77    let traits = m78        .functions79        .iter()80        .filter(|f| f.source == Source::Trait)81        .count();82    let defaults = m83        .functions84        .iter()85        .filter(|f| f.source == Source::Default)86        .count();87    lines.push(format!(88        "functions {}: ok {}, skip {}, private {}; {written} pub fn + {constant} pub const fn + {generated} macro-written + {traits} trait methods + {defaults} defaults; {macro_body_fns} pub fn lines inside macro_rules",89        m.functions.len(),90        total[0],91        total[1],92        total[2]93    ));94    lines95}