From a0c5ea1fdafd944516002741eb55bce918ccc5f6 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 26 Oct 2019 20:19:10 +0200 Subject: [PATCH] Convert id-in-collection command to new binary crate layout Signed-off-by: Matthias Beyer --- bin/core/imag-id-in-collection/Cargo.toml | 7 ++ bin/core/imag-id-in-collection/src/bin.rs | 40 ++++++++++ .../src/{main.rs => lib.rs} | 77 ++++++++++++------- 3 files changed, 95 insertions(+), 29 deletions(-) create mode 100644 bin/core/imag-id-in-collection/src/bin.rs rename bin/core/imag-id-in-collection/src/{main.rs => lib.rs} (59%) 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 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 similarity index 59% rename from bin/core/imag-id-in-collection/src/main.rs rename to 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 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::>()); +/// 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::>()); - let collection_filter = IsInCollectionsFilter::new(values); + let collection_filter = IsInCollectionsFilter::new(values); - let mut stdout = rt.stdout(); - trace!("Got output: {:?}", stdout); + let mut stdout = rt.stdout(); + trace!("Got output: {:?}", stdout); - rt.ids::()? - .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.ids::()? + .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() + 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") + } } -