diff --git a/README.md b/README.md index 03b4617..01655cd 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,34 @@ Diese Anwendung passt eine OSC-Datei so an, dass (standortbezogene) Formularvari verwendet werden. Hierzu wird die Datei deserialisiert, die entsprechenden Formularfelder ermittelt und die Formularvariante -sowie die Anzeige anhand eines Profils angepasst. \ No newline at end of file +sowie die Anzeige anhand eines Profils angepasst. + +## Profile + +Zum Erstellen von Varianten einer OSC-Datei wird eine Profildatei im YAML-Format verwendet. + +In ihr sind die durchzuführenden Änderungen definiert. Eine Profildatei hat die folgende Form: + +``` +forms: + - name: "ExampleForm" + fields: + - name: "ref_first_mtb" + referenced_data_form: "Formularverweis.Variante" + anzeige_auswahl: "Referenziertes Formular vom: {Datum}" + anzeige: "Datum im referenzierten Formular: {Datum}" +``` + +Hierzu wird die Anwendung angewiesen im Formular "ExampleForm" den Formularverweis im Formularfeld "ref_first_mtb": + +* den Verweis auf das Formular "Formularverweis.Variante" zu setzen +* die Anzeige im Auswahlmenü auf "Referenziertes Formular vom: {Datum}" zu setzen +* die Anzeige unterhalb des Auswahlmenüs auf "Datum im referenzierten Formular: {Datum}" zu setzen + +und dabei die vorhandenen Angaben für den Formularverweis zu ersetzen. + +Die Angaben für `referenced_data_form`, `anzeige_auswahl` und `anzeige` sind optional. +Wird keine Angabe gemacht, wird der bestehende Wert beibehalten. + +Es können beliebig viele Formulare mit beliebig vielen Änderungen zu Formularverweisen in einer Profildatei +hinterlegt werden, jedoch ist mindestens eine Angabe zu einem Formularfeld erforderlich. diff --git a/src/profile.rs b/src/profile.rs index 2b00018..ef69994 100644 --- a/src/profile.rs +++ b/src/profile.rs @@ -22,12 +22,12 @@ * SOFTWARE. */ -use std::str::FromStr; use serde::Deserialize; +use std::str::FromStr; #[derive(Deserialize)] struct Profile { - forms: Vec
+ forms: Vec, } impl FromStr for Profile { @@ -36,7 +36,7 @@ impl FromStr for Profile { fn from_str(s: &str) -> Result { match serde_yaml::from_str::(s) { Ok(profile) => Ok(profile), - Err(err) => Err(err.to_string()) + Err(err) => Err(err.to_string()), } } } @@ -44,28 +44,31 @@ impl FromStr for Profile { #[derive(Deserialize)] struct Form { name: String, - fields: Vec + fields: Vec, } #[derive(Deserialize)] struct FieldChanges { name: String, - referenced_data_form: Option + referenced_data_form: Option, + anzeige: Option, + anzeige_auswahl: Option, } #[cfg(test)] mod tests { - use std::str::FromStr; use crate::profile::Profile; + use std::str::FromStr; #[test] fn should_deserialize_profile() { - let content = - "forms: + let content = "forms: - name: 'DNPM Therapieplan' fields: - name: ref_first_mtb referenced_data_form: 'OS.Tumorkonferenz.VarianteUKW' + anzeige: 'Datum: {Datum}' + anzeige_auswahl: 'TK vom {Datum}' "; match Profile::from_str(content) { @@ -74,16 +77,48 @@ mod tests { assert_eq!(profile.forms[0].name, "DNPM Therapieplan"); assert_eq!(profile.forms[0].fields.len(), 1); assert_eq!(profile.forms[0].fields[0].name, "ref_first_mtb"); - assert_eq!(profile.forms[0].fields[0].referenced_data_form, Some("OS.Tumorkonferenz.VarianteUKW".to_string())); - }, - Err(e) => panic!("Cannot deserialize profile: {}", e) + assert_eq!( + profile.forms[0].fields[0].referenced_data_form, + Some("OS.Tumorkonferenz.VarianteUKW".to_string()) + ); + assert_eq!( + profile.forms[0].fields[0].anzeige, + Some("Datum: {Datum}".to_string()) + ); + assert_eq!( + profile.forms[0].fields[0].anzeige_auswahl, + Some("TK vom {Datum}".to_string()) + ); + } + Err(e) => panic!("Cannot deserialize profile: {}", e), + } + } + + #[test] + fn should_deserialize_profile_with_no_changes() { + let content = "forms: + - name: 'DNPM Therapieplan' + fields: + - name: ref_first_mtb + "; + + match Profile::from_str(content) { + Ok(profile) => { + assert_eq!(profile.forms.len(), 1); + assert_eq!(profile.forms[0].name, "DNPM Therapieplan"); + assert_eq!(profile.forms[0].fields.len(), 1); + assert_eq!(profile.forms[0].fields[0].name, "ref_first_mtb"); + assert_eq!(profile.forms[0].fields[0].referenced_data_form, None); + assert_eq!(profile.forms[0].fields[0].anzeige, None); + assert_eq!(profile.forms[0].fields[0].anzeige_auswahl, None); + } + Err(e) => panic!("Cannot deserialize profile: {}", e), } } #[test] fn should_not_deserialize_bad_profile() { - let content = - "forms: + let content = "forms: - name: 'DNPM Therapieplan' # incomplete profile ... "; @@ -91,5 +126,4 @@ mod tests { let actual = Profile::from_str(content); assert!(actual.is_err()); } - -} \ No newline at end of file +}