summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-10-26 20:19:10 +0200
committerMatthias Beyer <mail@beyermatthias.de>2019-10-26 20:19:10 +0200
commita0c5ea1fdafd944516002741eb55bce918ccc5f6 (patch)
tree57931cc9febf38c209753b2fbc5cfa3666da2848
parentb6facfff6b6c6adca609ad8618659b2ac34c3442 (diff)
Convert id-in-collection command to new binary crate layout
Signed-off-by: Matthias Beyer <mail@beyermatthias.de>
-rw-r--r--bin/core/imag-id-in-collection/Cargo.toml7
-rw-r--r--bin/core/imag-id-in-collection/src/bin.rs40
-rw-r--r--bin/core/imag-id-in-collection/src/lib.rs (renamed from bin/core/imag-id-in-collection/src/main.rs)85
3 files changed, 99 insertions, 33 deletions
diff --git a/bin/core/imag-id-in-collection/Cargo.toml b/bin/core/imag-id-in-collection/Cargo.toml
index 32b09dce..46e92716 100644
--- a/bin/core/imag-id-in-collection/Cargo.toml
+++ b/bin/core/imag-id-in-collection/Cargo.toml
@@ -38,3 +38,10 @@ features = ["color", "suggestions", "wrap_help"]
[dev-dependencies]
env_logger = "0.7"
+[lib]
+name = "libimagidincollectioncmd"
+path = "src/lib.rs"
+
+[[bin]]
+name = "imag-id-in-collection"
+path = "src/bin.rs"
diff --git a/bin/core/imag-id-in-collection/src/bin.rs b/bin/core/imag-id-in-collection/src/bin.rs
new file mode 100644
index 00000000..65c81e74
--- /dev/null
+++ b/bin/core/imag-id-in-collection/src/bin.rs
@@ -0,0 +1,40 @@
+//
+// imag - the personal information management suite for the commandline
+// Copyright (C) 2015-2019 Matthias Beyer <mail@beyermatthias.de> and contributors
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; version
+// 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+//
+
+#![forbid(unsafe_code)]
+
+#![deny(
+ non_camel_case_types,
+ non_snake_case,
+ path_statements,
+ trivial_numeric_casts,
+ unstable_features,
+ unused_allocation,
+ unused_import_braces,
+ unused_imports,
+ unused_must_use,
+ unused_mut,
+ unused_qualifications,
+ while_true,
+)]
+
+#[macro_use] extern crate libimagrt;
+
+simple_imag_application_binary!(libimagidincollectioncmd, ImagIdInCollection);
+
diff --git a/bin/core/imag-id-in-collection/src/main.rs b/bin/core/imag-id-in-collection/src/lib.rs
index 1821bbf8..9c75f54a 100644
--- a/bin/core/imag-id-in-collection/src/main.rs
+++ b/bin/core/imag-id-in-collection/src/lib.rs
@@ -46,7 +46,7 @@ extern crate env_logger;
extern crate libimagerror;
extern crate libimagstore;
-#[macro_use] extern crate libimagrt;
+extern crate libimagrt;
use std::io::Write;
@@ -54,9 +54,11 @@ use filters::filter::Filter;
use failure::Fallible as Result;
use failure::Error;
use failure::err_msg;
+use clap::App;
use libimagstore::storeid::StoreId;
-use libimagrt::setup::generate_runtime_setup;
+use libimagrt::application::ImagApplication;
+use libimagrt::runtime::Runtime;
mod ui;
@@ -83,35 +85,52 @@ impl<'a, A> Filter<StoreId> for IsInCollectionsFilter<'a, A>
}
-fn main() -> Result<()> {
- let version = make_imag_version!();
- let rt = generate_runtime_setup("imag-id-in-collection",
- &version,
- "filter ids by collection",
- crate::ui::build_ui);
- let values = rt
- .cli()
- .values_of("in-collection-filter")
- .map(|v| v.collect::<Vec<&str>>());
-
- let collection_filter = IsInCollectionsFilter::new(values);
-
- let mut stdout = rt.stdout();
- trace!("Got output: {:?}", stdout);
-
- rt.ids::<crate::ui::PathProvider>()?
- .ok_or_else(|| err_msg("No ids supplied"))?
- .iter()
- .filter(|id| collection_filter.filter(id))
- .map(|id| {
- if !rt.output_is_pipe() {
- let id = id.to_str()?;
- trace!("Writing to {:?}", stdout);
- writeln!(stdout, "{}", id)?;
- }
-
- rt.report_touched(&id).map_err(Error::from)
- })
- .collect()
-}
+/// Marker enum for implementing ImagApplication on
+///
+/// This is used by binaries crates to execute business logic
+/// or to build a CLI completion.
+pub enum ImagIdInCollection {}
+impl ImagApplication for ImagIdInCollection {
+ fn run(rt: Runtime) -> Result<()> {
+ let values = rt
+ .cli()
+ .values_of("in-collection-filter")
+ .map(|v| v.collect::<Vec<&str>>());
+
+ let collection_filter = IsInCollectionsFilter::new(values);
+
+ let mut stdout = rt.stdout();
+ trace!("Got output: {:?}", stdout);
+
+ rt.ids::<crate::ui::PathProvider>()?
+ .ok_or_else(|| err_msg("No ids supplied"))?
+ .iter()
+ .filter(|id| collection_filter.filter(id))
+ .map(|id| {
+ if !rt.output_is_pipe() {
+ let id = id.to_str()?;
+ trace!("Writing to {:?}", stdout);
+ writeln!(stdout, "{}", id)?;
+ }
+
+ rt.report_touched(&id).map_err(Error::from)
+ })
+ .collect()
+ }
+
+ fn build_cli<'a>(app: App<'a, 'a>) -> App<'a, 'a> {
+ ui::build_ui(app)
+ }
+
+ fn name() -> &'static str {
+ env!("CARGO_PKG_NAME")
+ }
+
+ fn description() -> &'static str {
+ "print all ids"
+ }
+ fn version() -> &'static str {
+ env!("CARGO_PKG_VERSION")
+ }
+}