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}