From 861af28724506b8f60f2dcf3a0b2d96023b3798f Mon Sep 17 00:00:00 2001 From: Leon Schuermann Date: Sat, 14 Sep 2019 18:29:37 +0200 Subject: [PATCH] imag-edit: implement ImagApplication Signed-off-by: Leon Schuermann --- bin/core/imag-edit/Cargo.toml | 7 ++ bin/core/imag-edit/src/bin.rs | 39 +++++++++++ bin/core/imag-edit/src/lib.rs | 121 +++++++++++++++++++++++++++++++++ bin/core/imag-edit/src/main.rs | 99 --------------------------- 4 files changed, 167 insertions(+), 99 deletions(-) create mode 100644 bin/core/imag-edit/src/bin.rs create mode 100644 bin/core/imag-edit/src/lib.rs delete mode 100644 bin/core/imag-edit/src/main.rs diff --git a/bin/core/imag-edit/Cargo.toml b/bin/core/imag-edit/Cargo.toml index b329e17f..6dc9a67d 100644 --- a/bin/core/imag-edit/Cargo.toml +++ b/bin/core/imag-edit/Cargo.toml @@ -49,3 +49,10 @@ path = "../../../lib/core/libimagrt" default-features = false features = ["testing"] +[lib] +name = "libimageditcmd" +path = "src/lib.rs" + +[[bin]] +name = "imag-edit" +path = "src/bin.rs" diff --git a/bin/core/imag-edit/src/bin.rs b/bin/core/imag-edit/src/bin.rs new file mode 100644 index 00000000..b0002164 --- /dev/null +++ b/bin/core/imag-edit/src/bin.rs @@ -0,0 +1,39 @@ +// +// 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!(libimageditcmd, ImagEdit); diff --git a/bin/core/imag-edit/src/lib.rs b/bin/core/imag-edit/src/lib.rs new file mode 100644 index 00000000..7d515c6d --- /dev/null +++ b/bin/core/imag-edit/src/lib.rs @@ -0,0 +1,121 @@ +// +// 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, +)] + +extern crate clap; +#[macro_use] extern crate log; +extern crate failure; + +extern crate libimagentryedit; +extern crate libimagerror; +extern crate libimagrt; +extern crate libimagstore; +extern crate libimagutil; + +use libimagerror::trace::MapErrTrace; +use libimagerror::iter::TraceIterator; +use libimagentryedit::edit::Edit; +use libimagentryedit::edit::EditHeader; +use libimagrt::runtime::Runtime; +use libimagrt::application::ImagApplication; +use libimagstore::storeid::StoreIdIterator; +use libimagstore::iter::get::StoreIdGetIteratorExtension; + +use failure::Fallible as Result; +use clap::App; + +mod ui; + +/// Marker enum for implementing ImagApplication on +/// +/// This is used by binaries crates to execute business logic +/// or to build a CLI completion. +pub enum ImagEdit {} +impl ImagApplication for ImagEdit { + fn run(rt: Runtime) -> Result<()> { + let edit_header = rt.cli().is_present("edit-header"); + let edit_header_only = rt.cli().is_present("edit-header-only"); + + let sids = rt + .ids::() + .map_err_trace_exit_unwrap() + .unwrap_or_else(|| { + error!("No ids supplied"); + ::std::process::exit(1); + }) + .into_iter(); + + StoreIdIterator::new(Box::new(sids.into_iter().map(Ok))) + .into_get_iter(rt.store()) + .trace_unwrap_exit() + .map(|o| o.unwrap_or_else(|| { + error!("Did not find one entry"); + ::std::process::exit(1) + })) + .for_each(|mut entry| { + if edit_header { + let _ = entry + .edit_header_and_content(&rt) + .map_err_trace_exit_unwrap(); + } else if edit_header_only { + let _ = entry + .edit_header(&rt) + .map_err_trace_exit_unwrap(); + } else { + let _ = entry + .edit_content(&rt) + .map_err_trace_exit_unwrap(); + } + }); + + Ok(()) + } + + 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 { + "Edit store entries with $EDITOR" + } + + fn version() -> &'static str { + env!("CARGO_PKG_VERSION") + } +} diff --git a/bin/core/imag-edit/src/main.rs b/bin/core/imag-edit/src/main.rs deleted file mode 100644 index 3e758d7c..00000000 --- a/bin/core/imag-edit/src/main.rs +++ /dev/null @@ -1,99 +0,0 @@ -// -// 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, -)] - -extern crate clap; -#[macro_use] extern crate log; -extern crate failure; - -extern crate libimagentryedit; -extern crate libimagerror; -#[macro_use] extern crate libimagrt; -extern crate libimagstore; -extern crate libimagutil; - -use libimagerror::trace::MapErrTrace; -use libimagerror::iter::TraceIterator; -use libimagentryedit::edit::Edit; -use libimagentryedit::edit::EditHeader; -use libimagrt::setup::generate_runtime_setup; -use libimagstore::storeid::StoreIdIterator; -use libimagstore::iter::get::StoreIdGetIteratorExtension; - -mod ui; - -fn main() { - let version = make_imag_version!(); - let rt = generate_runtime_setup("imag-edit", - &version, - "Edit store entries with $EDITOR", - ui::build_ui); - - let edit_header = rt.cli().is_present("edit-header"); - let edit_header_only = rt.cli().is_present("edit-header-only"); - - let sids = rt - .ids::() - .map_err_trace_exit_unwrap() - .unwrap_or_else(|| { - error!("No ids supplied"); - ::std::process::exit(1); - }) - .into_iter(); - - StoreIdIterator::new(Box::new(sids.map(Ok))) - .into_get_iter(rt.store()) - .trace_unwrap_exit() - .map(|o| o.unwrap_or_else(|| { - error!("Did not find one entry"); - ::std::process::exit(1) - })) - .for_each(|mut entry| { - if edit_header { - entry - .edit_header_and_content(&rt) - .map_err_trace_exit_unwrap(); - } else if edit_header_only { - entry - .edit_header(&rt) - .map_err_trace_exit_unwrap(); - } else { - entry - .edit_content(&rt) - .map_err_trace_exit_unwrap(); - } - }); -} -