From a0c5ea1fdafd944516002741eb55bce918ccc5f6 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 26 Oct 2019 20:19:10 +0200 Subject: [PATCH 1/2] 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") + } } - From d8354ce6f32abd7dfeb2542045cc7bbaf80c7cd1 Mon Sep 17 00:00:00 2001 From: Matthias Beyer Date: Sat, 26 Oct 2019 20:19:19 +0200 Subject: [PATCH 2/2] Add id-in-collection command Signed-off-by: Matthias Beyer --- bin/core/imag/Cargo.toml | 5 ++++- bin/core/imag/build.rs | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/bin/core/imag/Cargo.toml b/bin/core/imag/Cargo.toml index 1250b2f7..e97b508b 100644 --- a/bin/core/imag/Cargo.toml +++ b/bin/core/imag/Cargo.toml @@ -29,6 +29,7 @@ imag-diagnostics = { optional = true, path = "../imag-diagnostics" } imag-edit = { optional = true, path = "../imag-edit" } imag-gps = { optional = true, path = "../imag-gps" } imag-grep = { optional = true, path = "../imag-grep" } +imag-id-in-collection = { optional = true, path = "../imag-id-in-collection" } imag-ids = { optional = true, path = "../imag-ids" } imag-init = { optional = true, path = "../imag-init" } imag-link = { optional = true, path = "../imag-link" } @@ -86,6 +87,7 @@ cc-all = [ "cc-imag-edit", "cc-imag-gps", "cc-imag-grep", + "cc-imag-id-in-collection", "cc-imag-ids", "cc-imag-init", "cc-imag-link", @@ -112,6 +114,7 @@ cc-imag-diagnostics = [ "imag-diagnostics" ] cc-imag-edit = [ "imag-edit" ] cc-imag-gps = [ "imag-gps" ] cc-imag-grep = [ "imag-grep" ] +cc-imag-id-in-collection = [ "imag-id-in-collection" ] cc-imag-ids = [ "imag-ids" ] cc-imag-init = [ "imag-init" ] cc-imag-link = [ "imag-link" ] @@ -130,4 +133,4 @@ cc-imag-mail = [ "imag-mail" ] cc-imag-notes = [ "imag-notes" ] cc-imag-timetrack = [ "imag-timetrack" ] cc-imag-todo = [ "imag-todo" ] -cc-imag-wiki = [ "imag-wiki" ] \ No newline at end of file +cc-imag-wiki = [ "imag-wiki" ] diff --git a/bin/core/imag/build.rs b/bin/core/imag/build.rs index c7675ff2..69835487 100644 --- a/bin/core/imag/build.rs +++ b/bin/core/imag/build.rs @@ -40,6 +40,8 @@ extern crate libimageditcmd; extern crate libimaggpscmd; #[cfg(feature = "cc-imag-grep")] extern crate libimaggrepcmd; +#[cfg(feature = "cc-imag-id-in-collection")] +extern crate libimagidincollectioncmd; #[cfg(feature = "cc-imag-ids")] extern crate libimagidscmd; #[cfg(feature = "cc-imag-init")] @@ -119,6 +121,8 @@ fn main() { let app = app.subcommand(build_subcommand!("gps", libimaggpscmd, ImagGps)); #[cfg(feature = "cc-imag-grep")] let app = app.subcommand(build_subcommand!("grep", libimaggrepcmd, ImagGrep)); + #[cfg(feature = "cc-imag-id-in-collection")] + let app = app.subcommand(build_subcommand!("id-in-colleciton", libimagidincollectioncmd, ImagIdInCollection)); #[cfg(feature = "cc-imag-ids")] let app = app.subcommand(build_subcommand!("ids", libimagidscmd, ImagIds)); #[cfg(feature = "cc-imag-init")]