From fd454675133a8fb0b5dfd969bf6e4f08452e2bb8 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Wed, 12 Jun 2024 16:50:29 +0200 Subject: [PATCH] feat: show items not equal within db and xml --- src/lkrexport.rs | 19 ++++++++++++++++++- src/main.rs | 46 ++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 58 insertions(+), 7 deletions(-) diff --git a/src/lkrexport.rs b/src/lkrexport.rs index 27e3e2b..ee3e25c 100644 --- a/src/lkrexport.rs +++ b/src/lkrexport.rs @@ -124,6 +124,11 @@ impl Meldung { _ => None, } } + + pub fn no_linebreak(&self) -> String { + let re = Regex::new(r"\n\s*").unwrap(); + re.replace_all(&self.raw_value, "").trim().to_string() + } } pub fn to_database_id(id: &str) -> Option { @@ -147,7 +152,7 @@ pub fn to_database_id(id: &str) -> Option { #[cfg(test)] mod tests { - use crate::lkrexport::LkrExportProtocolFile; + use crate::lkrexport::{LkrExportProtocolFile, Meldung}; #[test] fn should_read_xml_file_content() { @@ -204,4 +209,16 @@ mod tests { Some("C17.2".to_string()) ); } + + #[test] + fn should_get_meldung_with_trimmed_margin() { + let meldung = Meldung { + raw_value: " \n TestInhalt 3\n\n".into(), + }; + + assert_eq!( + meldung.no_linebreak(), + "TestInhalt 3".to_string() + ); + } } diff --git a/src/main.rs b/src/main.rs index b2b7d1e..4c0a91d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,7 +29,7 @@ use itertools::Itertools; use crate::cli::{Cli, SubCommand}; use crate::common::{Check, DiffRecord, Icd10GroupSize}; use crate::database::DatabaseSource; -use crate::lkrexport::{to_database_id, LkrExportProtocolFile}; +use crate::lkrexport::{to_database_id, LkrExportProtocolFile, Meldung}; mod cli; mod common; @@ -467,6 +467,11 @@ fn main() -> Result<(), Box> { .map(|meldung| (meldung.id().unwrap(), meldung)) .collect::>(); + let missing_xml_ids = db_meldungen + .keys() + .filter(|&key| !xml_meldungen.contains_key(key)) + .collect_vec(); + let _ = term.clear_last_lines(1); let _ = term.write_line( @@ -512,11 +517,6 @@ fn main() -> Result<(), Box> { }); } - let missing_xml_ids = db_meldungen - .keys() - .filter(|&key| !xml_meldungen.contains_key(key)) - .collect_vec(); - if !missing_xml_ids.is_empty() { let _ = term.write_line( &style("\nIn der Protokolldatei fehlende Meldungen:") @@ -558,6 +558,40 @@ fn main() -> Result<(), Box> { let _ = term.write_line(&item.to_string()); }); } + + let different_content = db_meldungen + .iter() + .filter(|(id, _)| !missing_xml_ids.contains(id)) + .filter(|(id, meldung)| { + xml_meldungen + .get(&id.to_string()) + .unwrap_or(&Meldung { + raw_value: String::new(), + }) + .no_linebreak() + != meldung.no_linebreak() + }) + .map(|(_, meldung)| meldung.id().unwrap_or("?".into())) + .collect_vec(); + + if !different_content.is_empty() { + let _ = term.write_line( + &style(&format!( + "\nFolgende {} Meldungen unterscheiden sich in der Datenbank und der Protokolldatei:", + different_content.len() + )) + .yellow() + .to_string(), + ); + + different_content.iter().sorted().for_each(|item| { + let _ = term.write_line(&format!( + "{} ({})", + item, + to_database_id(item).unwrap_or("?".into()) + )); + }); + } } }