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

Check input file for additional entries

This will prevent the application from creating output without these
additional entities, which would be missing in output.

Instead, the application will exit with an error message.
This commit is contained in:
Paul-Christian Volkmer 2023-06-02 23:05:35 +02:00
parent 31a1dcb63e
commit 1224f93764
7 changed files with 80 additions and 40 deletions

View File

@ -41,31 +41,20 @@ mod profile;
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true, arg_required_else_help(true))]
struct Cli {
#[arg(
long = "input",
help = "Eingabedatei"
)]
#[arg(long = "input", help = "Eingabedatei")]
input: String,
#[arg(
long = "profile",
help = "Profildatei (Optional)"
)]
#[arg(long = "profile", help = "Profildatei (Optional)")]
profile: Option<String>,
#[arg(
long = "output",
help = "Ausgabedatei (Optional)"
)]
output: Option<String>
#[arg(long = "output", help = "Ausgabedatei (Optional)")]
output: Option<String>,
}
fn main() {
let cli = Cli::parse();
let contents = fs::read_to_string(cli.input)
.expect("Should have been able to read the file");
let mut data: OnkostarEditor = from_str(contents.as_str()).unwrap();
let contents = fs::read_to_string(cli.input).expect("Should have been able to read the file");
if let Ok(mut data) = from_str::<OnkostarEditor>(contents.as_str()) {
data.apply_variant();
let mut buf = String::new();
@ -75,12 +64,15 @@ fn main() {
data.serialize(serializer).expect("Generated XML");
let output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".to_string()
.add(buf
let output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
.to_string()
.add(
buf
// Replace &apos; and &quot; as used in original file
.replace("&apos;", "'")
.replace("&quot;", "\"")
.as_str());
.as_str(),
);
match cli.output {
Some(filename) => {
@ -89,11 +81,19 @@ fn main() {
.write(true)
.create(true)
.truncate(true)
.open(filename).unwrap();
file.write_all(output.as_bytes()).expect("Should have written output file");
},
.open(filename)
.unwrap();
file.write_all(output.as_bytes())
.expect("Should have written output file");
}
None => {
println!("{}", output)
}
}
} else {
eprintln!("Kann Eingabedatei nicht lesen!");
eprintln!(
"Die Datei ist entweder keine OSC-Datei, fehlerhaft oder enthält zusätzliche Inhalte."
);
}
}

View File

@ -27,6 +27,7 @@ use serde::{Deserialize, Serialize};
use crate::model::Ordner;
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct DataCatalogue {
#[serde(rename = "Name")]
name: String,
@ -55,12 +56,14 @@ pub struct DataCatalogue {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Entries {
#[serde(rename = "Entry")]
entry: Vec<Entry>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Entry {
#[serde(rename = "PropertyCatalogue")]
#[serde(skip_serializing_if = "Option::is_none")]
@ -122,12 +125,14 @@ pub struct Entry {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Use {
#[serde(rename = "ProgramModule", default)]
program_module: Vec<ProgramModule>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct ProgramModule {
#[serde(rename = "@program")]
program: String,

View File

@ -28,6 +28,7 @@ use crate::model::Ordner;
use crate::model::{Ansichten, Entries, Filter, MenuCategory, PlausibilityRules, Script};
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct DataForm {
#[serde(rename = "DataCatalogues")]
data_catalogues: DataCatalogues,
@ -162,12 +163,14 @@ impl DataForm {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct DataCatalogues {
#[serde(rename = "DataCatalogue")]
data_catalogue: Vec<String>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Entry {
#[serde(rename = "@parentId")]
#[serde(skip_serializing_if = "Option::is_none")]
@ -354,6 +357,7 @@ pub struct Entry {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct DataFormEntries {
#[serde(rename = "EntryName")]
entry_name: Option<Vec<String>>,

View File

@ -31,6 +31,7 @@ pub mod property_catalogue;
pub mod unterformular;
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Script {
#[serde(rename = "Code")]
code: String,
@ -39,6 +40,7 @@ pub struct Script {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct PlausibilityRule<T> {
#[serde(rename = "Type")]
type_: String,
@ -69,12 +71,14 @@ pub struct PlausibilityRule<T> {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Entries<T> {
#[serde(rename = "Entry")]
entry: Vec<T>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Ansicht {
#[serde(rename = "Name")]
name: String,
@ -101,12 +105,14 @@ pub struct Ansicht {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Ansichten {
#[serde(rename = "Ansicht", default)]
program_module: Vec<Ansicht>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct MenuCategory {
#[serde(rename = "name")]
name: String,
@ -117,6 +123,7 @@ pub struct MenuCategory {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Filter {
#[serde(rename = "Condition")]
condition: String,
@ -128,6 +135,7 @@ pub struct Filter {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct RefEntries {
#[serde(rename = "RefEntry")]
#[serde(skip_serializing_if = "Option::is_none")]
@ -135,6 +143,7 @@ pub struct RefEntries {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct PlausibilityRules<T> {
#[serde(rename = "PlausibilityRule")]
#[serde(skip_serializing_if = "Option::is_none")]
@ -142,12 +151,14 @@ pub struct PlausibilityRules<T> {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Bibliothek {
#[serde(rename = "Name")]
name: String,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Ordner {
#[serde(rename = "Bibliothek")]
bibliothek: Bibliothek,

View File

@ -30,6 +30,7 @@ use crate::model::property_catalogue::PropertyCatalogue;
use crate::model::unterformular::Unterformular;
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct OnkostarEditor {
#[serde(rename = "InfoXML")]
info_xml: InfoXML,
@ -49,6 +50,7 @@ impl OnkostarEditor {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct InfoXML {
#[serde(rename = "DatumXML")]
datum_xml: String,
@ -59,6 +61,7 @@ pub struct InfoXML {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
struct Editor {
#[serde(rename = "PropertyCatalogue")]
property_catalogue: Vec<PropertyCatalogue>,
@ -71,6 +74,7 @@ struct Editor {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Bibliothek {
#[serde(rename = "Name")]
name: String,

View File

@ -27,6 +27,7 @@ use serde::{Deserialize, Serialize};
use crate::model::Ordner;
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct PropertyCatalogue {
#[serde(rename = "Name")]
name: String,
@ -52,6 +53,7 @@ pub struct PropertyCatalogue {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Versions {
#[serde(rename = "Version")]
#[serde(skip_serializing_if = "Option::is_none")]
@ -59,6 +61,7 @@ pub struct Versions {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Version {
#[serde(rename = "VersionNumber")]
version_number: u16,
@ -86,12 +89,14 @@ pub struct Version {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct VersionEntries {
#[serde(rename = "Entry", default)]
content: Vec<VersionEntry>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct VersionEntry {
#[serde(rename = "Code")]
code: String,
@ -110,12 +115,14 @@ pub struct VersionEntry {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Categories {
#[serde(rename = "Category", default)]
content: Vec<Category>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Category {
#[serde(rename = "Name")]
name: String,
@ -132,12 +139,14 @@ pub struct Category {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct CategoryEntries {
#[serde(rename = "CategoryEntry", default)]
content: Vec<CategoryEntry>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct CategoryEntry {
#[serde(rename = "Code")]
code: String,
@ -156,6 +165,7 @@ pub struct CategoryEntry {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Abbildung {
#[serde(rename = "ZielMKVersionOid")]
ziel_mk_version_oid: String,
@ -164,6 +174,7 @@ pub struct Abbildung {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct AbbildungEintrag {
#[serde(rename = "Entry-from")]
entry_from: AbbildungEntry,
@ -172,6 +183,7 @@ pub struct AbbildungEintrag {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct AbbildungEntry {
#[serde(rename = "Code")]
code: String,

View File

@ -28,6 +28,7 @@ use crate::model::Ordner;
use crate::model::{Ansichten, Entries, Filter, MenuCategory, PlausibilityRules, Script};
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Unterformular {
#[serde(rename = "DataCatalogues")]
data_catalogues: DataCatalogues,
@ -170,12 +171,14 @@ impl Unterformular {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct DataCatalogues {
#[serde(rename = "DataCatalogue")]
data_catalogue: Vec<String>,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct Entry {
#[serde(rename = "@parentId")]
#[serde(skip_serializing_if = "Option::is_none")]
@ -363,6 +366,7 @@ pub struct Entry {
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(deny_unknown_fields)]
pub struct DataFormEntries {
#[serde(rename = "EntryName")]
#[serde(skip_serializing_if = "Option::is_none")]