feat: show items not equal within db and xml

This commit is contained in:
Paul-Christian Volkmer 2024-06-12 16:50:29 +02:00
parent 58026f11d0
commit fd45467513
2 changed files with 58 additions and 7 deletions

View File

@ -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<String> {
@ -147,7 +152,7 @@ pub fn to_database_id(id: &str) -> Option<String> {
#[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: " <Test>\n <Test2>TestInhalt 3</Test2>\n</Test>\n".into(),
};
assert_eq!(
meldung.no_linebreak(),
"<Test><Test2>TestInhalt 3</Test2></Test>".to_string()
);
}
}

View File

@ -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<dyn Error>> {
.map(|meldung| (meldung.id().unwrap(), meldung))
.collect::<HashMap<_, _>>();
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<dyn Error>> {
});
}
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<dyn Error>> {
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())
));
});
}
}
}