From c635c636b78dd31526fb19877857a3791b74c416 Mon Sep 17 00:00:00 2001 From: Nico Wagner Date: Mon, 10 Jul 2023 03:46:15 +0200 Subject: [PATCH 1/2] Don't require filter when an expresion file is given --- pica-toolkit/src/commands/filter.rs | 22 +++++++++++++++---- .../snapshot/filter/0204-filter-file-f.toml | 2 +- .../snapshot/filter/0204-filter-file-t.toml | 2 +- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/pica-toolkit/src/commands/filter.rs b/pica-toolkit/src/commands/filter.rs index 3fb12310d..79dd5846e 100644 --- a/pica-toolkit/src/commands/filter.rs +++ b/pica-toolkit/src/commands/filter.rs @@ -52,10 +52,10 @@ pub(crate) struct Filter { #[arg(long, short)] discard: Option, - /// Take filter expressions from + /// Take a filter expression from /// - /// Note: Using a expression file still requires a filter; e.g - /// `003@.0?`. + /// Note: Do not provide an additional filter expression as an CLI + /// argument! #[arg(long = "file", short = 'f')] expr_file: Option, @@ -127,6 +127,7 @@ pub(crate) struct Filter { output: Option, /// A filter expression used for searching + #[arg(default_value = "", hide_default_value = true)] filter: String, /// Read one or more files in normalized PICA+ format @@ -166,7 +167,20 @@ impl Filter { let keep_predicates = parse_predicates(&self.keep.unwrap_or_default())?; + let mut filenames = self.filenames; let filter_str = if let Some(filename) = self.expr_file { + // This "hack" is necessary, because it's not possible to + // distinguish between filter and filenames. If a expression + // file is given, it makes no sense to provide + // an filter expression as CLI argument. + if !self.filter.is_empty() { + if filenames != ["-"] { + filenames.insert(0, self.filter.into()); + } else { + filenames = vec![self.filter.into()]; + } + } + read_to_string(filename).unwrap() } else { self.filter @@ -222,7 +236,7 @@ impl Filter { .strsim_threshold(self.strsim_threshold as f64 / 100.0) .case_ignore(self.ignore_case); - 'outer: for filename in self.filenames { + 'outer: for filename in filenames { let mut reader = ReaderBuilder::new().from_path(filename)?; diff --git a/pica-toolkit/tests/snapshot/filter/0204-filter-file-f.toml b/pica-toolkit/tests/snapshot/filter/0204-filter-file-f.toml index 17b080794..7f61ccd91 100644 --- a/pica-toolkit/tests/snapshot/filter/0204-filter-file-f.toml +++ b/pica-toolkit/tests/snapshot/filter/0204-filter-file-f.toml @@ -1,5 +1,5 @@ bin.name = "pica" -args = "filter -f filter.txt \"003@?\"" +args = "filter -f filter.txt" status = "success" stdout = "" stderr = "" diff --git a/pica-toolkit/tests/snapshot/filter/0204-filter-file-t.toml b/pica-toolkit/tests/snapshot/filter/0204-filter-file-t.toml index e79437312..7be76d35c 100644 --- a/pica-toolkit/tests/snapshot/filter/0204-filter-file-t.toml +++ b/pica-toolkit/tests/snapshot/filter/0204-filter-file-t.toml @@ -1,4 +1,4 @@ bin.name = "pica" -args = "filter -f filter.txt \"003@?\"" +args = "filter -f filter.txt" status = "success" stderr = "" From 22c009c2b40e2efa08b357401f18e32524f59b88 Mon Sep 17 00:00:00 2001 From: Nico Wagner Date: Mon, 10 Jul 2023 03:52:03 +0200 Subject: [PATCH 2/2] Changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80b6f0b08..8b843166c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed * #643 Print more helpful error message on `ParsePicaError` +* #653 Don't require filter argument when an expression file is given ### Removed