From 4c9998ca1d54b447b47f714b4a9a467642c047ce Mon Sep 17 00:00:00 2001 From: Leon Schuermann Date: Sat, 14 Sep 2019 18:44:41 +0200 Subject: [PATCH] imag-markdown: implement ImagApplication Signed-off-by: Leon Schuermann --- bin/core/imag-markdown/Cargo.toml | 7 ++ bin/core/imag-markdown/src/bin.rs | 39 +++++++++ bin/core/imag-markdown/src/lib.rs | 123 +++++++++++++++++++++++++++++ bin/core/imag-markdown/src/main.rs | 102 ------------------------ 4 files changed, 169 insertions(+), 102 deletions(-) create mode 100644 bin/core/imag-markdown/src/bin.rs create mode 100644 bin/core/imag-markdown/src/lib.rs delete mode 100644 bin/core/imag-markdown/src/main.rs diff --git a/bin/core/imag-markdown/Cargo.toml b/bin/core/imag-markdown/Cargo.toml index a4575b91..e35d431a 100644 --- a/bin/core/imag-markdown/Cargo.toml +++ b/bin/core/imag-markdown/Cargo.toml @@ -34,3 +34,10 @@ version = "2.33.0" default-features = false features = ["color", "suggestions", "wrap_help"] +[lib] +name = "libimagmarkdowncmd" +path = "src/lib.rs" + +[[bin]] +name = "imag-markdown" +path = "src/bin.rs" diff --git a/bin/core/imag-markdown/src/bin.rs b/bin/core/imag-markdown/src/bin.rs new file mode 100644 index 00000000..66ddbd3c --- /dev/null +++ b/bin/core/imag-markdown/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!(libimagmarkdowncmd, ImagMarkdown); diff --git a/bin/core/imag-markdown/src/lib.rs b/bin/core/imag-markdown/src/lib.rs new file mode 100644 index 00000000..2250fe41 --- /dev/null +++ b/bin/core/imag-markdown/src/lib.rs @@ -0,0 +1,123 @@ +// +// 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 libimagerror; +extern crate libimagrt; +extern crate libimagstore; + +use std::io::Write; + +use failure::Error; +use failure::err_msg; +use failure::Fallible as Result; +use clap::App; + +use libimagerror::trace::MapErrTrace; +use libimagerror::iter::TraceIterator; +use libimagrt::runtime::Runtime; +use libimagrt::application::ImagApplication; +use libimagstore::iter::get::StoreIdGetIteratorExtension; + +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 ImagMarkdown {} +impl ImagApplication for ImagMarkdown { + fn run(rt: Runtime) -> Result<()> { + let only_links = rt.cli().is_present("links"); + let out = rt.stdout(); + let mut outlock = out.lock(); + + let iter = rt + .ids::() + .map_err_trace_exit_unwrap() + .unwrap_or_else(|| { + error!("No ids supplied"); + ::std::process::exit(1); + }) + .into_iter() + .map(Ok) + .into_get_iter(rt.store()) + .trace_unwrap_exit() + .map(|ofle| ofle.ok_or_else(|| { + err_msg("Entry does not exist but is in store. This is a BUG, please report!") + })) + .trace_unwrap_exit(); + + if only_links { + iter.map(|fle| libimagentrymarkdown::link::extract_links(fle.get_content())) + .for_each(|links| { + links.iter().for_each(|link| { + writeln!(outlock, "{title}: {link}", title = link.title, link = link.link) + .map_err(Error::from) + .map_err_trace_exit_unwrap(); + }) + }) + + } else { + iter.map(|fle| libimagentrymarkdown::html::to_html(fle.get_content())) + .trace_unwrap_exit() + .for_each(|html| { + writeln!(outlock, "{}", html).map_err(Error::from).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 { + "Print one or more imag entries after processing them with a markdown parser" + } + + fn version() -> &'static str { + env!("CARGO_PKG_VERSION") + } +} diff --git a/bin/core/imag-markdown/src/main.rs b/bin/core/imag-markdown/src/main.rs deleted file mode 100644 index f3c1029b..00000000 --- a/bin/core/imag-markdown/src/main.rs +++ /dev/null @@ -1,102 +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 libimagerror; -#[macro_use] extern crate libimagrt; -extern crate libimagstore; - -use std::io::Write; - -use failure::Error; -use failure::err_msg; - -use libimagerror::trace::MapErrTrace; -use libimagerror::iter::TraceIterator; -use libimagrt::setup::generate_runtime_setup; -use libimagstore::iter::get::StoreIdGetIteratorExtension; - -mod ui; - -fn main() { - let version = make_imag_version!(); - let rt = generate_runtime_setup("imag-markdown", - &version, - "Print one or more imag entries after processing them with a markdown parser", - ui::build_ui); - - let only_links = rt.cli().is_present("links"); - let out = rt.stdout(); - let mut outlock = out.lock(); - - let iter = rt - .ids::() - .map_err_trace_exit_unwrap() - .unwrap_or_else(|| { - error!("No ids supplied"); - ::std::process::exit(1); - }) - .into_iter() - .map(Ok) - .into_get_iter(rt.store()) - .trace_unwrap_exit() - .map(|ofle| ofle.ok_or_else(|| { - err_msg("Entry does not exist but is in store. This is a BUG, please report!") - })) - .trace_unwrap_exit(); - - if only_links { - iter.map(|fle| libimagentrymarkdown::link::extract_links(fle.get_content())) - .for_each(|links| { - links.iter().for_each(|link| { - writeln!(outlock, "{title}: {link}", title = link.title, link = link.link) - .map_err(Error::from) - .map_err_trace_exit_unwrap(); - }) - }) - - } else { - iter.map(|fle| libimagentrymarkdown::html::to_html(fle.get_content())) - .trace_unwrap_exit() - .for_each(|html| { - writeln!(outlock, "{}", html).map_err(Error::from).map_err_trace_exit_unwrap(); - }) - } -} -