From 13bcd74f6c9a084857e3efc029ddc72ee35ec7de Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Fri, 10 Nov 2023 12:34:41 +0100 Subject: [PATCH] Issue #22: Check form references to previously undefined forms in OSC files --- Cargo.lock | 4 +-- src/checks/mod.rs | 14 ++++++++ src/model/onkostar_editor.rs | 63 +++++++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 426d282..040f444 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -750,9 +750,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "tokio" -version = "1.33.0" +version = "1.34.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" dependencies = [ "backtrace", "bytes", diff --git a/src/checks/mod.rs b/src/checks/mod.rs index 4d378ec..f29a3e4 100644 --- a/src/checks/mod.rs +++ b/src/checks/mod.rs @@ -225,6 +225,20 @@ pub fn print_checks() { ", fixable: true, }, + Problem { + code: "2023-0004", + name: "Verweis auf noch nicht definiertes Formular (OSTARSUPP-13212)", + description: " Wenn ein Formular einen Verweis auf ein anderes Formular enthält,\n \ + das nicht vor diesem Formular in der OSC-Datei definiert ist, wird der\n \ + Formularverweis beim Import der OSC-Datei nicht übernommen.\n\n \ + Dies kann bei wechselseitiger Abhängigkeit zwischen zwei (Unter-)Formularen\n \ + auftreten.\n\n \ + In diesem Fall kann ein erneuter/zweiter Import helfen, da das Onkostar in\n \ + diesem Fall alle Formulare importiert hat und der Formularverweis dann \n \ + gespeichert werden kann. + ", + fixable: false, + }, ] .iter() .for_each(|problem| println!("{}\n", problem)) diff --git a/src/model/onkostar_editor.rs b/src/model/onkostar_editor.rs index f612ef1..3c93fe5 100644 --- a/src/model/onkostar_editor.rs +++ b/src/model/onkostar_editor.rs @@ -34,7 +34,7 @@ use crate::checks::{CheckNotice, Checkable}; use crate::model::data_catalogue::DataCatalogue; use crate::model::data_form::DataForm; use crate::model::property_catalogue::PropertyCatalogue; -use crate::model::requirements::Requires; +use crate::model::requirements::{Requirement, Requires}; use crate::model::unterformular::Unterformular; use crate::model::{Comparable, FolderContent, FormEntryContainer, Listable, Sortable}; use crate::profile::Profile; @@ -412,6 +412,8 @@ impl FromStr for OnkostarEditor { impl Checkable for OnkostarEditor { fn check(&self) -> Vec { + // Inner form checks + let mut result = self .editor .data_form @@ -428,6 +430,65 @@ impl Checkable for OnkostarEditor { result.append(other); + // Check requirements + + let mut requirement_checked_forms = vec![]; + + fn requirement_error( + form: &impl Comparable, + item: &impl Comparable, + t: &str, + ) -> CheckNotice { + CheckNotice::ErrorWithCode { + code: "2023-0004".to_string(), + description: format!( + "'{}' hat einen Verweis auf zuvor nicht definiertes {t} '{}' (OSTARSUPP-13212)", + form.get_name(), + item.get_name() + ), + line: None, + example: None, + } + } + + self.editor.unterformular.iter().for_each(|form| { + requirement_checked_forms.push(form.get_name()); + form.get_required_entries(self) + .iter() + .for_each(|entry| match entry { + Requirement::DataFormReference(&ref item) => { + if !requirement_checked_forms.contains(&item.get_name()) { + result.push(requirement_error(form, item, "Formular")) + } + } + Requirement::UnterformularReference(&ref item) => { + if !requirement_checked_forms.contains(&item.get_name()) { + result.push(requirement_error(form, item, "Unterformular")) + } + } + _ => {} + }); + }); + + self.editor.data_form.iter().for_each(|form| { + requirement_checked_forms.push(form.get_name()); + form.get_required_entries(self) + .iter() + .for_each(|entry| match entry { + Requirement::DataFormReference(&ref item) => { + if !requirement_checked_forms.contains(&item.get_name()) { + result.push(requirement_error(form, item, "Formular")) + } + } + Requirement::UnterformularReference(&ref item) => { + if !requirement_checked_forms.contains(&item.get_name()) { + result.push(requirement_error(form, item, "Unterformular")) + } + } + _ => {} + }); + }); + result } }