mirror of
https://github.com/pcvolkmer/osc-variant.git
synced 2025-04-19 11:46:50 +00:00
Merge pull request #23 from CCC-MF/issue_22
Check form references to previously undefined forms in OSC files
This commit is contained in:
commit
a1e5133516
4
Cargo.lock
generated
4
Cargo.lock
generated
@ -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",
|
||||
|
@ -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))
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user