summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Beyer <mail@beyermatthias.de>2019-11-02 17:49:55 +0100
committerMatthias Beyer <mail@beyermatthias.de>2019-11-02 17:49:55 +0100
commit8270646283e6402642626a3cf53d1c8c8decb78f (patch)
tree00754e8fedbb60b3e2899233f7afc9e84c8e0b57
parent69ea42dcad4c4a3870356f6a7fa6235396a1f1a4 (diff)
parentd8354ce6f32abd7dfeb2542045cc7bbaf80c7cd1 (diff)
Merge branch 'convert-id-in-collection-command' into master
-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
-rw-r--r--bin/core/imag/Cargo.toml5
-rw-r--r--bin/core/imag/build.rs4
5 files changed, 107 insertions, 34 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")
+ }
+}
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")]