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:
parent
31a1dcb63e
commit
1224f93764
46
src/main.rs
46
src/main.rs
@ -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 ' and " as used in original file
|
||||
.replace("'", "'")
|
||||
.replace(""", "\"")
|
||||
.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."
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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>>,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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")]
|
||||
|
Loading…
x
Reference in New Issue
Block a user