diff --git a/src/model/data_form.rs b/src/model/data_form.rs index 91a9a75..57c3cd6 100644 --- a/src/model/data_form.rs +++ b/src/model/data_form.rs @@ -289,6 +289,27 @@ impl Requires for DataForm { .collect::>(); result.append(referenced_forms); + let sub_forms = &mut self + .entries + .entry + .iter() + .filter(|&entry| entry.get_type() == "subform") + .filter_map(|entry| match &entry.referenced_data_form { + Some(name) => Some(name), + None => None, + }) + .collect::>() + .into_iter() + .map(|entry| match all.find_data_form(entry.as_str()) { + Some(contained) => Requirement::DataFormSubform(contained), + None => match all.find_unterformular(entry.as_str()) { + Some(contained) => Requirement::UnterformularSubform(contained), + None => Requirement::ExternalUnterformularSubform(entry.to_string()), + }, + }) + .collect::>(); + result.append(sub_forms); + result } @@ -331,6 +352,12 @@ impl Requires for DataForm { | Requirement::ExternalUnterformularReference(_) => { Some(format!(" > {}\n", entry.to_string())) } + Requirement::DataFormSubform(_) + | Requirement::ExternalDataFormSubform(_) + | Requirement::UnterformularSubform(_) + | Requirement::ExternalUnterformularSubform(_) => { + Some(format!(" $ {}\n", entry.to_string())) + } _ => None, }) .filter(Option::is_some) diff --git a/src/model/requirements.rs b/src/model/requirements.rs index 7d10d97..cf6bcc1 100644 --- a/src/model/requirements.rs +++ b/src/model/requirements.rs @@ -40,6 +40,12 @@ pub enum Requirement<'a> { #[allow(dead_code)] ExternalDataFormReference(String), ExternalUnterformularReference(String), + + DataFormSubform(&'a DataForm), + UnterformularSubform(&'a Unterformular), + #[allow(dead_code)] + ExternalDataFormSubform(String), + ExternalUnterformularSubform(String), } impl ToString for Requirement<'_> { @@ -61,6 +67,14 @@ impl ToString for Requirement<'_> { Requirement::ExternalUnterformularReference(name) => { format!("Unterformular (-) '{}' - hier nicht enthalten", name) } + Requirement::DataFormSubform(item) => item.to_listed_string(), + Requirement::UnterformularSubform(item) => item.to_listed_string(), + Requirement::ExternalDataFormSubform(name) => { + format!("Formular (-) '{}' - hier nicht enthalten", name) + } + Requirement::ExternalUnterformularSubform(name) => { + format!("Unterformular (-) '{}' - hier nicht enthalten", name) + } } } } diff --git a/src/model/unterformular.rs b/src/model/unterformular.rs index 999db19..823bd12 100644 --- a/src/model/unterformular.rs +++ b/src/model/unterformular.rs @@ -293,6 +293,27 @@ impl Requires for Unterformular { .collect::>(); result.append(referenced_forms); + let sub_forms = &mut self + .entries + .entry + .iter() + .filter(|&entry| entry.get_type() == "subform") + .filter_map(|entry| match &entry.referenced_data_form { + Some(name) => Some(name), + None => None, + }) + .collect::>() + .into_iter() + .map(|entry| match all.find_data_form(entry.as_str()) { + Some(contained) => Requirement::DataFormSubform(contained), + None => match all.find_unterformular(entry.as_str()) { + Some(contained) => Requirement::UnterformularSubform(contained), + None => Requirement::ExternalUnterformularSubform(entry.to_string()), + }, + }) + .collect::>(); + result.append(sub_forms); + result } @@ -334,6 +355,12 @@ impl Requires for Unterformular { | Requirement::ExternalUnterformularReference(_) => { Some(format!(" > {}\n", entry.to_string())) } + Requirement::DataFormSubform(_) + | Requirement::ExternalDataFormSubform(_) + | Requirement::UnterformularSubform(_) + | Requirement::ExternalUnterformularSubform(_) => { + Some(format!(" $ {}\n", entry.to_string())) + } _ => None, }) .filter(Option::is_some)