mirror of
				https://github.com/pcvolkmer/osc-variant.git
				synced 2025-10-31 16:26:12 +00:00 
			
		
		
		
	feat: extended support for DataFormReferences tag
This commit is contained in:
		| @@ -17,15 +17,7 @@ | |||||||
|  * with this program; if not, write to the Free Software Foundation, Inc., |  * with this program; if not, write to the Free Software Foundation, Inc., | ||||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||||
|  */ |  */ | ||||||
| use console::style; | use crate::checks::CheckNotice::{ErrorWithCode, Warning}; | ||||||
| use serde::{Deserialize, Serialize}; |  | ||||||
| use std::any::TypeId; |  | ||||||
| use std::cmp::Ordering; |  | ||||||
| use std::collections::HashSet; |  | ||||||
| use std::fmt::Debug; |  | ||||||
| use std::marker::PhantomData; |  | ||||||
|  |  | ||||||
| use crate::checks::CheckNotice::ErrorWithCode; |  | ||||||
| use crate::checks::{CheckNotice, Checkable}; | use crate::checks::{CheckNotice, Checkable}; | ||||||
| use crate::model::onkostar_editor::OnkostarEditor; | use crate::model::onkostar_editor::OnkostarEditor; | ||||||
| use crate::model::other::Entry; | use crate::model::other::Entry; | ||||||
| @@ -37,6 +29,13 @@ use crate::model::{ | |||||||
| }; | }; | ||||||
| use crate::model::{Haeufigkeiten, Ordner}; | use crate::model::{Haeufigkeiten, Ordner}; | ||||||
| use crate::profile::Profile; | use crate::profile::Profile; | ||||||
|  | use console::style; | ||||||
|  | use serde::{Deserialize, Serialize}; | ||||||
|  | use std::any::TypeId; | ||||||
|  | use std::cmp::Ordering; | ||||||
|  | use std::collections::HashSet; | ||||||
|  | use std::fmt::Debug; | ||||||
|  | use std::marker::PhantomData; | ||||||
|  |  | ||||||
| #[derive(Debug)] | #[derive(Debug)] | ||||||
| pub struct DataFormType; | pub struct DataFormType; | ||||||
| @@ -409,12 +408,36 @@ where | |||||||
|                     Some(contained) => Requirement::DataFormReference(contained), |                     Some(contained) => Requirement::DataFormReference(contained), | ||||||
|                     None => match all.find_unterformular(entry.as_str()) { |                     None => match all.find_unterformular(entry.as_str()) { | ||||||
|                         Some(contained) => Requirement::UnterformularReference(contained), |                         Some(contained) => Requirement::UnterformularReference(contained), | ||||||
|                         None => Requirement::ExternalUnterformularReference(entry.to_string()), |                         None => Requirement::ExternalDataFormReference(entry.to_string()), | ||||||
|                     }, |                     }, | ||||||
|                 }) |                 }) | ||||||
|                 .collect::<Vec<_>>(); |                 .collect::<Vec<_>>(); | ||||||
|  |  | ||||||
|  |             // | ||||||
|  |             let new_referenced_forms = &mut entries | ||||||
|  |                 .entry | ||||||
|  |                 .iter() | ||||||
|  |                 .flat_map(|entry| &entry.data_form_references) | ||||||
|  |                 .flat_map(|rdf| { | ||||||
|  |                     rdf.referenced_data_form | ||||||
|  |                         .iter() | ||||||
|  |                         .map(|x| x.name.to_string()) | ||||||
|  |                         .collect::<Vec<_>>() | ||||||
|  |                 }) | ||||||
|  |                 .map(|entry| match all.find_data_form(entry.as_str()) { | ||||||
|  |                     Some(contained) => Requirement::DataFormReference(contained), | ||||||
|  |                     None => match all.find_unterformular(entry.as_str()) { | ||||||
|  |                         Some(contained) => Requirement::UnterformularReference(contained), | ||||||
|  |                         None => Requirement::ExternalDataFormReference(entry.to_string()), | ||||||
|  |                     }, | ||||||
|  |                 }) | ||||||
|  |                 .collect::<Vec<_>>(); | ||||||
|  |             referenced_forms.append(new_referenced_forms); | ||||||
|             referenced_forms.sort_unstable_by_key(Requirement::sorting_key); |             referenced_forms.sort_unstable_by_key(Requirement::sorting_key); | ||||||
|  |  | ||||||
|  |             referenced_forms.dedup_by_key(|requirement| requirement.sorting_key()); | ||||||
|             result.append(referenced_forms); |             result.append(referenced_forms); | ||||||
|  |             // | ||||||
|  |  | ||||||
|             let sub_forms = &mut entries |             let sub_forms = &mut entries | ||||||
|                 .entry |                 .entry | ||||||
| @@ -453,7 +476,21 @@ impl<Type: 'static> FolderContent for Form<Type> { | |||||||
|  |  | ||||||
| impl<Type> Form<Type> { | impl<Type> Form<Type> { | ||||||
|     fn common_check(&self) -> Vec<CheckNotice> { |     fn common_check(&self) -> Vec<CheckNotice> { | ||||||
|         let missing_forms = match self.entries { |         let missing_forms_in_refs = match self.entries { | ||||||
|  |             Some(ref entries) => entries | ||||||
|  |                 .entry | ||||||
|  |                 .iter() | ||||||
|  |                 .filter(|entry| { | ||||||
|  |                     entry.type_ == "formReference" | ||||||
|  |                         && entry.referenced_data_form.is_none() | ||||||
|  |                         && entry.data_form_references.is_none() | ||||||
|  |                 }) | ||||||
|  |                 .map(|entry| format!("'{}'", entry.get_name())) | ||||||
|  |                 .collect::<Vec<_>>(), | ||||||
|  |             None => vec![], | ||||||
|  |         }; | ||||||
|  |  | ||||||
|  |         let missing_forms_in_refs_legacy = match self.entries { | ||||||
|             Some(ref entries) => entries |             Some(ref entries) => entries | ||||||
|                 .entry |                 .entry | ||||||
|                 .iter() |                 .iter() | ||||||
| @@ -467,19 +504,29 @@ impl<Type> Form<Type> { | |||||||
|  |  | ||||||
|         let mut result = vec![]; |         let mut result = vec![]; | ||||||
|  |  | ||||||
|         if !missing_forms.is_empty() { |         if !missing_forms_in_refs.is_empty() && !missing_forms_in_refs_legacy.is_empty() { | ||||||
|             result.push(ErrorWithCode { |             result.push(ErrorWithCode { | ||||||
|                 code: "2024-0005".to_string(), |                 code: "2024-0005".to_string(), | ||||||
|                 description: format!( |                 description: format!( | ||||||
|                     "Formular '{}' hat Formularverweise ohne Angabe des Formulars in: {}", |                     "Formular '{}' hat Formularverweise ohne Angabe des Formulars in: {}", | ||||||
|                     self.name, |                     self.name, | ||||||
|                     missing_forms.join(", ") |                     missing_forms_in_refs.join(", ") | ||||||
|                 ), |                 ), | ||||||
|                 line: None, |                 line: None, | ||||||
|                 example: None, |                 example: None, | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         if missing_forms_in_refs.is_empty() && !missing_forms_in_refs_legacy.is_empty() { | ||||||
|  |             result.push(Warning { | ||||||
|  |                 description: format!( | ||||||
|  |                     "Formular '{}' hat Formularverweise, die erst in neueren Onkostar-Versionen ab 2.14.0 funktionieren", | ||||||
|  |                     self.name | ||||||
|  |                 ), | ||||||
|  |                 line: None, | ||||||
|  |             }); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         result |         result | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -579,5 +579,5 @@ impl Sortable for Entry { | |||||||
| #[serde(deny_unknown_fields)] | #[serde(deny_unknown_fields)] | ||||||
| pub struct ReferencedDataForm { | pub struct ReferencedDataForm { | ||||||
|     #[serde(rename = "ReferencedDataForm", default)] |     #[serde(rename = "ReferencedDataForm", default)] | ||||||
|     referenced_data_form: Vec<Form<DataFormReferenceType>>, |     pub referenced_data_form: Vec<Form<DataFormReferenceType>>, | ||||||
| } | } | ||||||
|   | |||||||
| @@ -31,10 +31,11 @@ pub enum Requirement<'a> { | |||||||
|     DataCatalogue(&'a DataCatalogue), |     DataCatalogue(&'a DataCatalogue), | ||||||
|     ExternalPropertyCatalogue(String), |     ExternalPropertyCatalogue(String), | ||||||
|     ExternalDataCatalogue(String), |     ExternalDataCatalogue(String), | ||||||
|  |  | ||||||
|     DataFormReference(&'a Form<DataFormType>), |     DataFormReference(&'a Form<DataFormType>), | ||||||
|     UnterformularReference(&'a Form<UnterformularType>), |     UnterformularReference(&'a Form<UnterformularType>), | ||||||
|     #[allow(dead_code)] |  | ||||||
|     ExternalDataFormReference(String), |     ExternalDataFormReference(String), | ||||||
|  |     #[allow(dead_code)] | ||||||
|     ExternalUnterformularReference(String), |     ExternalUnterformularReference(String), | ||||||
|  |  | ||||||
|     DataFormSubform(&'a Form<DataFormType>), |     DataFormSubform(&'a Form<DataFormType>), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user