1
0
mirror of https://github.com/pcvolkmer/osc-variant.git synced 2025-07-02 00:42:53 +00:00

Apply changes from profile to data

This commit is contained in:
2023-06-03 17:50:27 +02:00
parent 169a1eff00
commit eceafe18be
6 changed files with 115 additions and 40 deletions

31
examples/dnpm-ukw.yml Normal file
View File

@ -0,0 +1,31 @@
forms:
- name: 'DNPM Klinik/Anamnese'
form_references:
- name: MTB
referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW'
anzeige_auswahl: 'MTB vom {Datum}'
- name: 'DNPM Therapieplan'
form_references:
- name: referstemtb
referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW'
anzeige_auswahl: 'MTB vom {Datum}'
- name: 'DNPM Therapieplan'
form_references:
- name: reftkhumangenber
referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW'
anzeige_auswahl: 'MTB vom {Datum}'
- name: 'DNPM Therapieplan'
form_references:
- name: reftkreevaluation
referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW'
anzeige_auswahl: 'MTB vom {Datum}'
- name: 'DNPM UF Einzelempfehlung'
form_references:
- name: mtb
referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW'
anzeige_auswahl: 'MTB vom {Datum}'
- name: 'DNPM UF Rebiopsie'
form_references:
- name: reftumorkonferenz
referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW'
anzeige_auswahl: 'MTB vom {Datum}'

View File

@ -26,6 +26,7 @@ use std::fs;
use std::fs::OpenOptions; use std::fs::OpenOptions;
use std::io::Write; use std::io::Write;
use std::ops::Add; use std::ops::Add;
use std::str::FromStr;
use clap::{Parser, Subcommand}; use clap::{Parser, Subcommand};
use quick_xml::de::from_str; use quick_xml::de::from_str;
@ -33,6 +34,7 @@ use quick_xml::se::Serializer;
use serde::Serialize; use serde::Serialize;
use crate::model::onkostar_editor::OnkostarEditor; use crate::model::onkostar_editor::OnkostarEditor;
use crate::profile::Profile;
mod model; mod model;
mod profile; mod profile;
@ -85,7 +87,16 @@ fn main() {
fs::read_to_string(inputfile).expect("Should have been able to read the file"); fs::read_to_string(inputfile).expect("Should have been able to read the file");
if let Ok(mut data) = from_str::<OnkostarEditor>(contents.as_str()) { if let Ok(mut data) = from_str::<OnkostarEditor>(contents.as_str()) {
data.apply_variant(); if let Some(profile) = profile {
let profile =
fs::read_to_string(profile).expect("Should have been able to read profile");
if let Ok(profile) = Profile::from_str(profile.as_str()) {
data.apply_profile(&profile);
} else {
eprintln!("Kann Profildatei nicht lesen!");
return;
}
}
let mut buf = String::new(); let mut buf = String::new();

View File

@ -26,6 +26,7 @@ use serde::{Deserialize, Serialize};
use crate::model::Ordner; use crate::model::Ordner;
use crate::model::{Ansichten, Entries, Filter, MenuCategory, PlausibilityRules, Script}; use crate::model::{Ansichten, Entries, Filter, MenuCategory, PlausibilityRules, Script};
use crate::profile::Profile;
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
@ -146,19 +147,34 @@ pub struct DataForm {
} }
impl DataForm { impl DataForm {
pub fn apply_variant(&mut self) { pub fn apply_profile(&mut self, profile: &Profile) {
if self.name.starts_with("DNPM") { profile.forms.iter().for_each(|profile_form| {
self.entries.entry.iter_mut().for_each(|mut entry| { if self.name == profile_form.name {
if entry.type_ == "formReference" { self.entries.entry.iter_mut().for_each(|entry| {
if let Some(referenced_data_form) = &entry.referenced_data_form { profile_form
if referenced_data_form == "OS.Tumorkonferenz" { .form_references
entry.referenced_data_form = .iter()
Some("OS.Tumorkonferenz.VarianteUKW".to_string()) .for_each(|form_reference| {
} if entry.type_ == "formReference" && entry.name == form_reference.name {
} if let Some(profile_referenced_data_form) =
} &form_reference.referenced_data_form
}) {
} entry.referenced_data_form =
Some(profile_referenced_data_form.clone())
}
if let Some(profile_anzeige) = &form_reference.anzeige {
entry.anzeige = profile_anzeige.clone()
}
if let Some(profile_anzeige_auswahl) =
&form_reference.anzeige_auswahl
{
entry.anzeige_auswahl = Some(profile_anzeige_auswahl.clone())
}
}
});
})
}
});
} }
pub fn to_listed_string(&self) -> String { pub fn to_listed_string(&self) -> String {

View File

@ -29,6 +29,7 @@ use crate::model::data_catalogue::DataCatalogue;
use crate::model::data_form::DataForm; use crate::model::data_form::DataForm;
use crate::model::property_catalogue::PropertyCatalogue; use crate::model::property_catalogue::PropertyCatalogue;
use crate::model::unterformular::Unterformular; use crate::model::unterformular::Unterformular;
use crate::profile::Profile;
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
@ -40,12 +41,12 @@ pub struct OnkostarEditor {
} }
impl OnkostarEditor { impl OnkostarEditor {
pub fn apply_variant(&mut self) { pub fn apply_profile(&mut self, profile: &Profile) {
self.editor.data_form.iter_mut().for_each(|data_form| { self.editor.data_form.iter_mut().for_each(|data_form| {
data_form.apply_variant(); data_form.apply_profile(profile);
}); });
self.editor.unterformular.iter_mut().for_each(|data_form| { self.editor.unterformular.iter_mut().for_each(|data_form| {
data_form.apply_variant(); data_form.apply_profile(profile);
}) })
} }

View File

@ -27,6 +27,7 @@ use serde::{Deserialize, Serialize};
use crate::model::Ordner; use crate::model::Ordner;
use crate::model::{Ansichten, Entries, Filter, MenuCategory, PlausibilityRules, Script}; use crate::model::{Ansichten, Entries, Filter, MenuCategory, PlausibilityRules, Script};
use crate::profile::Profile;
#[derive(Serialize, Deserialize, Debug)] #[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)] #[serde(deny_unknown_fields)]
@ -155,19 +156,34 @@ pub struct Unterformular {
} }
impl Unterformular { impl Unterformular {
pub fn apply_variant(&mut self) { pub fn apply_profile(&mut self, profile: &Profile) {
if self.name.starts_with("DNPM") { profile.forms.iter().for_each(|profile_form| {
self.entries.entry.iter_mut().for_each(|mut entry| { if self.name == profile_form.name {
if entry.type_ == "formReference" { self.entries.entry.iter_mut().for_each(|entry| {
if let Some(referenced_data_form) = &entry.referenced_data_form { profile_form
if referenced_data_form == "OS.Tumorkonferenz" { .form_references
entry.referenced_data_form = .iter()
Some("OS.Tumorkonferenz.VarianteUKW".to_string()) .for_each(|form_reference| {
} if entry.type_ == "formReference" && entry.name == form_reference.name {
} if let Some(profile_referenced_data_form) =
} &form_reference.referenced_data_form
}) {
} entry.referenced_data_form =
Some(profile_referenced_data_form.clone())
}
if let Some(profile_anzeige) = &form_reference.anzeige {
entry.anzeige = profile_anzeige.clone()
}
if let Some(profile_anzeige_auswahl) =
&form_reference.anzeige_auswahl
{
entry.anzeige_auswahl = Some(profile_anzeige_auswahl.clone())
}
}
});
})
}
});
} }
pub fn to_listed_string(&self) -> String { pub fn to_listed_string(&self) -> String {

View File

@ -26,8 +26,8 @@ use serde::Deserialize;
use std::str::FromStr; use std::str::FromStr;
#[derive(Deserialize)] #[derive(Deserialize)]
struct Profile { pub struct Profile {
forms: Vec<Form>, pub forms: Vec<Form>,
} }
impl FromStr for Profile { impl FromStr for Profile {
@ -42,17 +42,17 @@ impl FromStr for Profile {
} }
#[derive(Deserialize)] #[derive(Deserialize)]
struct Form { pub struct Form {
name: String, pub name: String,
form_references: Vec<FormReference>, pub form_references: Vec<FormReference>,
} }
#[derive(Deserialize)] #[derive(Deserialize)]
struct FormReference { pub struct FormReference {
name: String, pub name: String,
referenced_data_form: Option<String>, pub referenced_data_form: Option<String>,
anzeige: Option<String>, pub anzeige: Option<String>,
anzeige_auswahl: Option<String>, pub anzeige_auswahl: Option<String>,
} }
#[cfg(test)] #[cfg(test)]