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

feat: change form types to fix some OSC issues

This will:

* convert "Unterformular" to "DataForm" if flag `Hat_Unterformulare`
  is set to true
* convert "DataForm" to "Unterformular" if required entry for
  procedure date is not set
* sort forms by required form references
This commit is contained in:
Paul-Christian Volkmer 2024-11-07 19:54:18 +01:00
parent 8be859d274
commit 95ba080875
3 changed files with 85 additions and 9 deletions

View File

@ -207,7 +207,7 @@ pub fn handle(command: SubCommand) -> Result<(), Box<dyn Error>> {
}
if fix {
// No operation as of now
data = data.fix();
}
if sorted {

View File

@ -17,14 +17,6 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
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;
use crate::checks::CheckNotice::ErrorWithCode;
use crate::checks::{CheckNotice, Checkable};
use crate::model::onkostar_editor::OnkostarEditor;
@ -37,6 +29,15 @@ use crate::model::{
};
use crate::model::{Haeufigkeiten, Ordner};
use crate::profile::Profile;
use console::style;
use quick_xml::de::from_str;
use quick_xml::se::Serializer;
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)]
pub struct DataFormType;
@ -201,6 +202,24 @@ pub struct Form<Type> {
ansichten: Option<Ansichten>,
}
impl Form<DataFormType> {
pub(crate) fn to_unterformular(&self) -> Form<UnterformularType> {
let mut buf = String::new();
let serializer = Serializer::new(&mut buf);
self.serialize(serializer).expect("Generated XML");
from_str::<Form<UnterformularType>>(&buf).unwrap()
}
}
impl Form<UnterformularType> {
pub(crate) fn to_dataform(&self) -> Form<DataFormType> {
let mut buf = String::new();
let serializer = Serializer::new(&mut buf);
self.serialize(serializer).expect("Generated XML");
from_str::<Form<DataFormType>>(&buf).unwrap()
}
}
impl<Type: 'static> FormEntryContainer for Form<Type> {
fn apply_profile(&mut self, profile: &Profile) {
profile.forms.iter().for_each(|profile_form| {

View File

@ -211,6 +211,63 @@ impl OnkostarEditor {
}
}
pub fn fix(mut self) -> Self {
fn has_error1(form: &Form<UnterformularType>, error_code: &str) -> bool {
form.check()
.iter()
.filter(|&check_notice| match check_notice {
CheckNotice::ErrorWithCode { code, .. } => code == error_code,
_ => false,
})
.count()
> 0
}
fn has_error2(form: &Form<DataFormType>, error_code: &str) -> bool {
form.check()
.iter()
.filter(|&check_notice| match check_notice {
CheckNotice::ErrorWithCode { code, .. } => code == error_code,
_ => false,
})
.count()
> 0
}
self.editor
.data_form
.iter_mut()
.filter(|form| has_error2(form, "2023-0002"))
.map(|form| form.to_unterformular())
.for_each(|form| self.editor.unterformular.push(form));
self.editor
.unterformular
.iter_mut()
.filter(|form| has_error1(form, "2023-0001"))
.map(|form| form.to_dataform())
.for_each(|form| self.editor.data_form.push(form));
self.editor
.data_form
.retain(|form| !has_error2(form, "2023-0002"));
self.editor
.unterformular
.retain(|form| !has_error1(form, "2023-0001"));
// Sort forms by requirements
self.editor
.data_form
.sort_unstable_by(Form::compare_by_requirement);
self.editor
.unterformular
.sort_unstable_by(Form::compare_by_requirement);
self
}
pub fn sorted(&mut self) {
self.editor
.property_catalogue