From 11b233b64221ac8f1299c175a80a084f343f8bdb Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Thu, 15 Jun 2023 23:27:21 +0200 Subject: [PATCH] Add optional sorted listing of file contents --- README.md | 4 ++++ src/cli.rs | 9 ++++++++- src/main.rs | 7 +++++-- src/model/data_catalogue.rs | 8 +++++++- src/model/data_form.rs | 8 +++++++- src/model/mod.rs | 4 ++++ src/model/onkostar_editor.rs | 20 +++++++++++++++++++- src/model/property_catalogue.rs | 8 +++++++- src/model/unterformular.rs | 8 +++++++- 9 files changed, 68 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index cf3ee69..69411e0 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,10 @@ Ohne eine Angabe der Ausgabedatei wird auf die Standardausgabe ausgegeben. OSC-Dateien sind XML-Dateien. Diese Anwendung ermöglicht optional die Ausgabe als kompaktere XML-Datei ohne Zeilenumbrüche. Hierzu ist die Option `--compact` vorgesehen. Es können, je nach Datei, bis zu 30% eingespart werden. +#### Sortierung + +Bei der Auflistung der Inhalte, kann optional `--sorted` dazu verwendet werden, die angezeigten Einträge alphabetisch zu sortieren. + ## Profile Zum Erstellen von Varianten einer OSC-Datei wird eine Profildatei im YAML-Format verwendet. diff --git a/src/cli.rs b/src/cli.rs index 2e05b72..2899d4f 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -35,7 +35,14 @@ pub struct Cli { #[derive(Subcommand)] pub enum Command { #[command(about = "Zeigt alle enthaltenen Kataloge und Formulare mit Revision an.")] - List { inputfile: String }, + List { + inputfile: String, + #[arg( + long = "sorted", + help = "Sortiere Kataloge und Formulare nach Name (Optional)" + )] + sorted: bool, + }, #[command(about = "Modifiziert die angegebene Datei anhand der Profildatei")] Modify { inputfile: String, diff --git a/src/main.rs b/src/main.rs index d52dd7f..6cc0ed9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -109,8 +109,11 @@ fn main() -> Result<(), Box> { let cli = Cli::parse(); match cli.command { - Command::List { inputfile } => { - let data = read_inputfile(inputfile)?; + Command::List { inputfile, sorted } => { + let mut data = read_inputfile(inputfile)?; + if sorted { + data.sorted() + } data.print_list(); } Command::Modify { diff --git a/src/model/data_catalogue.rs b/src/model/data_catalogue.rs index 224d210..205f5e1 100644 --- a/src/model/data_catalogue.rs +++ b/src/model/data_catalogue.rs @@ -24,7 +24,7 @@ use serde::{Deserialize, Serialize}; -use crate::model::{Listable, Ordner}; +use crate::model::{Listable, Ordner, Sortable}; #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] @@ -64,6 +64,12 @@ impl Listable for DataCatalogue { } } +impl Sortable for DataCatalogue { + fn sorting_key(&self) -> String { + self.name.clone() + } +} + #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct Entries { diff --git a/src/model/data_form.rs b/src/model/data_form.rs index dc6c63e..b4b29bf 100644 --- a/src/model/data_form.rs +++ b/src/model/data_form.rs @@ -26,7 +26,7 @@ use serde::{Deserialize, Serialize}; use crate::model::{ apply_profile_to_form_entry, Ansichten, Entries, Filter, FormEntry, FormEntryContainer, - Listable, MenuCategory, PlausibilityRules, Script, + Listable, MenuCategory, PlausibilityRules, Script, Sortable, }; use crate::model::{Haeufigkeiten, Ordner}; use crate::profile::Profile; @@ -183,6 +183,12 @@ impl Listable for DataForm { } } +impl Sortable for DataForm { + fn sorting_key(&self) -> String { + self.name.clone() + } +} + #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct DataCatalogues { diff --git a/src/model/mod.rs b/src/model/mod.rs index fee45db..6dc72cf 100644 --- a/src/model/mod.rs +++ b/src/model/mod.rs @@ -234,6 +234,10 @@ pub trait Listable { fn to_listed_string(&self) -> String; } +pub trait Sortable { + fn sorting_key(&self) -> String; +} + pub trait FormEntry { fn get_name(&self) -> String; fn get_type(&self) -> String; diff --git a/src/model/onkostar_editor.rs b/src/model/onkostar_editor.rs index ce5f3a2..50ae9c9 100644 --- a/src/model/onkostar_editor.rs +++ b/src/model/onkostar_editor.rs @@ -31,7 +31,7 @@ use crate::model::data_catalogue::DataCatalogue; use crate::model::data_form::DataForm; use crate::model::property_catalogue::PropertyCatalogue; use crate::model::unterformular::Unterformular; -use crate::model::{FormEntryContainer, Listable}; +use crate::model::{FormEntryContainer, Listable, Sortable}; use crate::profile::Profile; #[derive(Serialize, Deserialize, Debug)] @@ -71,6 +71,24 @@ impl OnkostarEditor { list.iter() .for_each(|entry| println!("{}", entry.to_listed_string())); } + + pub fn sorted(&mut self) { + self.editor + .property_catalogue + .sort_unstable_by_key(|e| e.sorting_key()); + + self.editor + .data_catalogue + .sort_unstable_by_key(|e| e.sorting_key()); + + self.editor + .data_form + .sort_unstable_by_key(|e| e.sorting_key()); + + self.editor + .unterformular + .sort_unstable_by_key(|e| e.sorting_key()); + } } impl FromStr for OnkostarEditor { diff --git a/src/model/property_catalogue.rs b/src/model/property_catalogue.rs index 7e0bfab..28710e9 100644 --- a/src/model/property_catalogue.rs +++ b/src/model/property_catalogue.rs @@ -24,7 +24,7 @@ use serde::{Deserialize, Serialize}; -use crate::model::{Listable, Ordner}; +use crate::model::{Listable, Ordner, Sortable}; #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] @@ -61,6 +61,12 @@ impl Listable for PropertyCatalogue { } } +impl Sortable for PropertyCatalogue { + fn sorting_key(&self) -> String { + self.name.clone() + } +} + #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct Versions { diff --git a/src/model/unterformular.rs b/src/model/unterformular.rs index 7858d99..f170d52 100644 --- a/src/model/unterformular.rs +++ b/src/model/unterformular.rs @@ -27,7 +27,7 @@ use serde::{Deserialize, Serialize}; use crate::model::{ apply_profile_to_form_entry, Ansichten, Entries, Filter, FormEntry, FormEntryContainer, - Listable, MenuCategory, PlausibilityRules, Script, + Listable, MenuCategory, PlausibilityRules, Script, Sortable, }; use crate::model::{Haeufigkeiten, Ordner}; use crate::profile::Profile; @@ -206,6 +206,12 @@ impl Listable for Unterformular { } } +impl Sortable for Unterformular { + fn sorting_key(&self) -> String { + self.name.clone() + } +} + #[derive(Serialize, Deserialize, Debug)] #[serde(deny_unknown_fields)] pub struct DataCatalogues {