diff --git a/bin/domain/imag-timetrack/Cargo.toml b/bin/domain/imag-timetrack/Cargo.toml index 1f023946..88408449 100644 --- a/bin/domain/imag-timetrack/Cargo.toml +++ b/bin/domain/imag-timetrack/Cargo.toml @@ -39,3 +39,10 @@ version = "2.33.0" default-features = false features = ["color", "suggestions", "wrap_help"] +[lib] +name = "libimagtimetrackfrontend" +path = "src/lib.rs" + +[[bin]] +name = "imag-timetrack" +path = "src/bin.rs" diff --git a/bin/domain/imag-timetrack/src/bin.rs b/bin/domain/imag-timetrack/src/bin.rs new file mode 100644 index 00000000..e9feb5f8 --- /dev/null +++ b/bin/domain/imag-timetrack/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!(libimagtimetrackfrontend, ImagTimetrack); diff --git a/bin/domain/imag-timetrack/src/lib.rs b/bin/domain/imag-timetrack/src/lib.rs new file mode 100644 index 00000000..6b94477f --- /dev/null +++ b/bin/domain/imag-timetrack/src/lib.rs @@ -0,0 +1,137 @@ +// +// 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 log; + +extern crate clap; +extern crate chrono; +extern crate filters; +extern crate itertools; +extern crate prettytable; +extern crate kairos; +extern crate failure; + +extern crate libimagerror; +extern crate libimagstore; +extern crate libimagrt; +extern crate libimagtimetrack; +extern crate libimagutil; + +mod cont; +mod day; +mod list; +mod month; +mod shell; +mod start; +mod stop; +mod track; +mod ui; +mod week; +mod year; + +use crate::cont::cont; +use crate::day::day; +use crate::list::{list, list_impl}; +use crate::month::month; +use crate::shell::shell; +use crate::start::start; +use crate::stop::stop; +use crate::track::track; +use crate::week::week; +use crate::year::year; + +use clap::App; +use failure::Fallible as Result; + +use libimagrt::runtime::Runtime; +use libimagrt::application::ImagApplication; +use libimagerror::trace::MapErrTrace; + +/// Marker enum for implementing ImagApplication on +/// +/// This is used by binaries crates to execute business logic +/// or to build a CLI completion. +pub enum ImagTimetrack {} +impl ImagApplication for ImagTimetrack { + fn run(rt: Runtime) -> Result<()> { + let command = rt.cli().subcommand_name(); + let retval = if let Some(command) = command { + debug!("Call: {}", command); + match command { + "continue" => cont(&rt), + "day" => day(&rt), + "list" => list(&rt), + "month" => month(&rt), + "shell" => shell(&rt), + "start" => start(&rt), + "stop" => stop(&rt), + "track" => track(&rt), + "week" => week(&rt), + "year" => year(&rt), + other => { + debug!("Unknown command"); + rt.handle_unknown_subcommand("imag-timetrack", other, rt.cli()) + .map_err_trace_exit_unwrap() + .code() + .unwrap_or(0) + }, + } + } else { + let start = ::chrono::offset::Local::today().naive_local().and_hms(0, 0, 0); + let end = ::chrono::offset::Local::today().naive_local().and_hms(23, 59, 59); + list_impl(&rt, Some(start), Some(end), false, false) + }; + + ::std::process::exit(retval); + } + + 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 { + "Time tracking module" + } + + fn version() -> &'static str { + env!("CARGO_PKG_VERSION") + } +} diff --git a/bin/domain/imag-timetrack/src/main.rs b/bin/domain/imag-timetrack/src/main.rs deleted file mode 100644 index 1c06e845..00000000 --- a/bin/domain/imag-timetrack/src/main.rs +++ /dev/null @@ -1,117 +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, -)] - -#[macro_use] -extern crate log; - -extern crate clap; -extern crate chrono; -extern crate filters; -extern crate itertools; -extern crate prettytable; -extern crate kairos; -extern crate failure; - -extern crate libimagerror; -extern crate libimagstore; -#[macro_use] extern crate libimagrt; -extern crate libimagtimetrack; -extern crate libimagutil; - -mod cont; -mod day; -mod list; -mod month; -mod shell; -mod start; -mod stop; -mod track; -mod ui; -mod week; -mod year; - -use crate::cont::cont; -use crate::day::day; -use crate::list::{list, list_impl}; -use crate::month::month; -use crate::shell::shell; -use crate::start::start; -use crate::stop::stop; -use crate::track::track; -use crate::ui::build_ui; -use crate::week::week; -use crate::year::year; - -use libimagrt::setup::generate_runtime_setup; -use libimagerror::trace::MapErrTrace; - -fn main() { - let version = make_imag_version!(); - let rt = generate_runtime_setup("imag-timetrack", - &version, - "Time tracking module", - build_ui); - - let command = rt.cli().subcommand_name(); - let retval = if let Some(command) = command { - debug!("Call: {}", command); - match command { - "continue" => cont(&rt), - "day" => day(&rt), - "list" => list(&rt), - "month" => month(&rt), - "shell" => shell(&rt), - "start" => start(&rt), - "stop" => stop(&rt), - "track" => track(&rt), - "week" => week(&rt), - "year" => year(&rt), - other => { - debug!("Unknown command"); - rt.handle_unknown_subcommand("imag-timetrack", other, rt.cli()) - .map_err_trace_exit_unwrap() - .code() - .unwrap_or(0) - }, - } - } else { - let start = ::chrono::offset::Local::today().naive_local().and_hms(0, 0, 0); - let end = ::chrono::offset::Local::today().naive_local().and_hms(23, 59, 59); - list_impl(&rt, Some(start), Some(end), false, false) - }; - - ::std::process::exit(retval); -}