diff --git a/README.md b/README.md index 64ef148..6aa8111 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,12 @@ 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. +#### Filter + +Bei der Auflistung von Inhalten ist es möglich, die Ausgaben anhand des Namens zu filtern. +Hierzu ist die Option `--filter=` vorgesehen. +Wird diese angewendet, werden nur Inhalte ausgegeben, deren Name die angegebene Zeichenkette beinhalten. + #### Sortierung Bei der Auflistung der Inhalte, kann die Option `--sorted` dazu verwendet werden, die angezeigten Einträge alphabetisch zu sortieren. diff --git a/src/cli.rs b/src/cli.rs index 937f461..0194f9d 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -47,6 +47,8 @@ pub enum Command { help = "Sortiere Kataloge und Formulare nach Name (Optional)" )] sorted: bool, + #[arg(long = "filter", help = "Filtere Ausgabe nach Name (Optional)")] + filter: Option, }, #[command(about = "Zeigt Kataloge und Formulare mit Revision und Abhängigkeiten an.")] Tree { @@ -56,6 +58,8 @@ pub enum Command { help = "Sortiere Kataloge und Formulare nach Name (Optional)" )] sorted: bool, + #[arg(long = "filter", help = "Filtere Ausgabe nach Name (Optional)")] + filter: Option, }, #[command(about = "Modifiziert die angegebene Datei anhand der Profildatei")] Modify { diff --git a/src/main.rs b/src/main.rs index 2537564..9d89fc5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -112,18 +112,34 @@ fn main() -> Result<(), Box> { let cli = Cli::parse(); match cli.command { - Command::List { inputfile, sorted } => { + Command::List { + inputfile, + sorted, + filter, + } => { let mut data = read_inputfile(inputfile)?; if sorted { data.sorted() } + if let Some(name) = filter { + OnkostarEditor::print_list_filtered(&mut data, name.as_str()); + return Ok(()); + } data.print_list(); } - Command::Tree { inputfile, sorted } => { + Command::Tree { + inputfile, + sorted, + filter, + } => { let mut data = read_inputfile(inputfile)?; if sorted { data.sorted() } + if let Some(name) = filter { + OnkostarEditor::print_tree_filtered(&mut data, name.as_str()); + return Ok(()); + } OnkostarEditor::print_tree(&data); } Command::Modify { diff --git a/src/model/onkostar_editor.rs b/src/model/onkostar_editor.rs index 9ee3d9f..03ae9d4 100644 --- a/src/model/onkostar_editor.rs +++ b/src/model/onkostar_editor.rs @@ -130,6 +130,37 @@ impl OnkostarEditor { Self::print_items("Unterformulare", &self.editor.unterformular); } + fn filter_by_name_contains(&mut self, name: &str) { + self.editor + .property_catalogue + .retain(|e| e.get_name().contains(name)); + self.editor + .data_catalogue + .retain(|e| e.get_name().contains(name)); + self.editor + .data_form + .retain(|e| e.get_name().contains(name)); + self.editor + .unterformular + .retain(|e| e.get_name().contains(name)); + } + pub fn print_list_filtered(&mut self, name: &str) { + println!( + "Die Datei wurde am {} mit {} in Version {} erstellt.\n\nFolgende Inhalte für '{}' sind gespeichert", + style(&self.info_xml.datum_xml).yellow(), + style(&self.info_xml.name).yellow(), + style(&self.info_xml.version).yellow(), + name + ); + + self.filter_by_name_contains(name); + + Self::print_items("Merkmalskataloge", &self.editor.property_catalogue); + Self::print_items("Datenkataloge", &self.editor.data_catalogue); + Self::print_items("Formulare", &self.editor.data_form); + Self::print_items("Unterformulare", &self.editor.unterformular); + } + fn print_items(title: &str, list: &[impl Listable]) { print!("\n{} {}", list.len(), style(title).underlined()); println!( @@ -154,6 +185,23 @@ impl OnkostarEditor { self.print_items_tree("Unterformulare", &self.editor.unterformular); } + pub fn print_tree_filtered(&mut self, name: &str) { + println!( + "Die Datei wurde am {} mit {} in Version {} erstellt.\n\nFolgende Inhalte für '{}' sind gespeichert", + style(&self.info_xml.datum_xml).yellow(), + style(&self.info_xml.name).yellow(), + style(&self.info_xml.version).yellow(), + name + ); + + self.filter_by_name_contains(name); + + Self::print_items("Merkmalskataloge", &self.editor.property_catalogue); + self.print_items_tree("Datenkataloge", &self.editor.data_catalogue); + self.print_items_tree("Formulare", &self.editor.data_form); + self.print_items_tree("Unterformulare", &self.editor.unterformular); + } + fn print_items_tree(&self, title: &str, list: &[impl Requires]) { print!("\n{} {}", list.len(), style(title).underlined()); println!(