1
0
mirror of https://github.com/pcvolkmer/osc-variant.git synced 2025-04-19 11:46:50 +00:00

Issue #22: Check form references to previously undefined forms in OSC files

This commit is contained in:
Paul-Christian Volkmer 2023-11-10 12:34:41 +01:00
parent 6fdbe06106
commit 13bcd74f6c
3 changed files with 78 additions and 3 deletions

4
Cargo.lock generated
View File

@ -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",

View File

@ -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))

View File

@ -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<CheckNotice> {
// 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
}
}