From 4942824526ca3e061515449a59234115f94a3b23 Mon Sep 17 00:00:00 2001 From: Jan Petykiewicz Date: Tue, 21 Apr 2026 22:55:52 -0700 Subject: [PATCH] Add engine type aggregate parser views --- .../rrt-runtime/src/inspect/engine_types.rs | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/crates/rrt-runtime/src/inspect/engine_types.rs b/crates/rrt-runtime/src/inspect/engine_types.rs index 2815e02..e5fb8f8 100644 --- a/crates/rrt-runtime/src/inspect/engine_types.rs +++ b/crates/rrt-runtime/src/inspect/engine_types.rs @@ -150,6 +150,8 @@ pub struct EngineTypesInspectionReport { pub lco_body_type_label_counts: BTreeMap, pub cgo_scalar_value_counts: BTreeMap, pub cgo_scalar_values_by_content_stem: BTreeMap>, + pub cct_identifier_counts: BTreeMap, + pub cct_value_counts: BTreeMap, pub locomotive_display_census: EngineTypeLocomotiveDisplayCensusReport, pub families: Vec, } @@ -371,6 +373,16 @@ pub fn inspect_engine_types_dir( ); let cgo_scalar_values_by_content_stem = build_cgo_scalar_values_by_content_stem(cgo_reports.values()); + let cct_identifier_counts = count_named_values( + family_entries + .iter() + .filter_map(|family| family.cct_identifier.as_deref()), + ); + let cct_value_counts = count_owned_values( + family_entries + .iter() + .filter_map(|family| family.cct_value.map(|value| value.to_string())), + ); let locomotive_display_census = build_locomotive_display_census(path, &family_entries, &car_reports)?; @@ -420,6 +432,8 @@ pub fn inspect_engine_types_dir( lco_body_type_label_counts, cgo_scalar_value_counts, cgo_scalar_values_by_content_stem, + cct_identifier_counts, + cct_value_counts, locomotive_display_census, families: family_entries, }) @@ -586,14 +600,15 @@ fn read_lco_companion_stem(bytes: &[u8]) -> Option { slot_is_padded(bytes, LCO_INTERNAL_STEM_OFFSET, 0x08) .then(|| read_ascii_slot(bytes, LCO_COMPANION_STEM_OFFSET, LCO_COMPANION_STEM_LEN)) .flatten() + .filter(|value| value.len() >= 4) } fn read_lco_body_type_label(bytes: &[u8]) -> Option { - let companion_slot_is_padded = - slot_is_padded(bytes, LCO_COMPANION_STEM_OFFSET, LCO_COMPANION_STEM_LEN); - companion_slot_is_padded + let _companion_stem = read_lco_companion_stem(bytes)?; + slot_is_padded(bytes, LCO_COMPANION_STEM_OFFSET, LCO_COMPANION_STEM_LEN) .then(|| read_ascii_slot(bytes, LCO_BODY_TYPE_LABEL_OFFSET, LCO_BODY_TYPE_LABEL_LEN)) .flatten() + .filter(|value| value.len() >= 4) } fn parse_cct_row(line: &str) -> (Option, Option) { @@ -853,6 +868,13 @@ mod tests { ); } + #[test] + fn counts_owned_value_strings() { + let counts = count_owned_values(["13".to_string(), "13".to_string(), "4".to_string()].into_iter()); + assert_eq!(counts.get("13"), Some(&2)); + assert_eq!(counts.get("4"), Some(&1)); + } + #[test] fn builds_locomotive_display_census() { let mut car_reports = BTreeMap::new();