diff --git a/bin/domain/imag-wiki/Cargo.toml b/bin/domain/imag-wiki/Cargo.toml index 123eeb90..eca68017 100644 --- a/bin/domain/imag-wiki/Cargo.toml +++ b/bin/domain/imag-wiki/Cargo.toml @@ -21,6 +21,7 @@ toml-query = "0.9.2" is-match = "0.1.0" regex = "1.1.7" filters = "0.3.0" +failure = "0.1.5" libimagentryedit = { version = "0.10.0", path = "../../../lib/entry/libimagentryedit" } libimagentrylink = { version = "0.10.0", path = "../../../lib/entry/libimagentrylink" } @@ -31,3 +32,10 @@ libimagstore = { version = "0.10.0", path = "../../../lib/core/libimagst libimagwiki = { version = "0.10.0", path = "../../../lib/domain/libimagwiki" } libimagutil = { version = "0.10.0", path = "../../../lib/etc/libimagutil" } +[lib] +name = "libimagwikifrontend" +path = "src/lib.rs" + +[[bin]] +name = "imag-wiki" +path = "src/bin.rs" diff --git a/bin/domain/imag-wiki/src/bin.rs b/bin/domain/imag-wiki/src/bin.rs new file mode 100644 index 00000000..ae6b391d --- /dev/null +++ b/bin/domain/imag-wiki/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!(libimagwikifrontend, ImagWiki); diff --git a/bin/domain/imag-wiki/src/main.rs b/bin/domain/imag-wiki/src/lib.rs similarity index 82% rename from bin/domain/imag-wiki/src/main.rs rename to bin/domain/imag-wiki/src/lib.rs index 8a25776f..f541c14f 100644 --- a/bin/domain/imag-wiki/src/main.rs +++ b/bin/domain/imag-wiki/src/lib.rs @@ -23,8 +23,9 @@ extern crate clap; extern crate regex; extern crate filters; #[macro_use] extern crate log; +extern crate failure; -#[macro_use] extern crate libimagrt; +extern crate libimagrt; extern crate libimagerror; extern crate libimagstore; extern crate libimagwiki; @@ -33,9 +34,11 @@ extern crate libimagentrylink; extern crate libimagutil; use std::io::Write; +use failure::Fallible as Result; +use clap::App; use libimagrt::runtime::Runtime; -use libimagrt::setup::generate_runtime_setup; +use libimagrt::application::ImagApplication; use libimagerror::iter::TraceIterator; use libimagerror::trace::MapErrTrace; use libimagerror::exit::ExitUnwrap; @@ -44,36 +47,55 @@ use libimagwiki::store::WikiStore; use libimagentryedit::edit::{Edit, EditHeader}; mod ui; -use crate::ui::build_ui; -fn main() { - let version = make_imag_version!(); - let rt = generate_runtime_setup("imag-wiki", - &version, - "Personal wiki", - build_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 ImagWiki {} +impl ImagApplication for ImagWiki { + fn run(rt: Runtime) -> Result<()> { + let wiki_name = rt.cli().value_of("wikiname").unwrap_or("default"); + trace!("wiki_name = {}", wiki_name); + trace!("calling = {:?}", rt.cli().subcommand_name()); - let wiki_name = rt.cli().value_of("wikiname").unwrap_or("default"); - trace!("wiki_name = {}", wiki_name); - trace!("calling = {:?}", rt.cli().subcommand_name()); + match rt.cli().subcommand_name() { + Some("list") => list(&rt, wiki_name), + Some("idof") => idof(&rt, wiki_name), + Some("create") => create(&rt, wiki_name), + Some("create-wiki") => create_wiki(&rt), + Some("show") => show(&rt, wiki_name), + Some("delete") => delete(&rt, wiki_name), + Some(other) => { + debug!("Unknown command"); + let _ = rt.handle_unknown_subcommand("imag-wiki", other, rt.cli()) + .map_err_trace_exit_unwrap() + .code() + .map(std::process::exit); + } + None => warn!("No command"), + } // end match scmd + + 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 { + "Personal wiki" + } + + fn version() -> &'static str { + env!("CARGO_PKG_VERSION") + } +} - match rt.cli().subcommand_name() { - Some("list") => list(&rt, wiki_name), - Some("idof") => idof(&rt, wiki_name), - Some("create") => create(&rt, wiki_name), - Some("create-wiki") => create_wiki(&rt), - Some("show") => show(&rt, wiki_name), - Some("delete") => delete(&rt, wiki_name), - Some(other) => { - debug!("Unknown command"); - let _ = rt.handle_unknown_subcommand("imag-wiki", other, rt.cli()) - .map_err_trace_exit_unwrap() - .code() - .map(std::process::exit); - } - None => warn!("No command"), - } // end match scmd -} // end main fn list(rt: &Runtime, wiki_name: &str) { let scmd = rt.cli().subcommand_matches("list").unwrap(); // safed by clap