diff --git a/imag-mail/Cargo.toml b/imag-mail/Cargo.toml new file mode 100644 index 00000000..86f2a1be --- /dev/null +++ b/imag-mail/Cargo.toml @@ -0,0 +1,28 @@ +[package] +name = "imag-mail" +version = "0.2.0" +authors = ["Matthias Beyer "] + +[dependencies] +semver = "0.5" +clap = "2.*" +log = "0.3" +version = "2.0.1" +toml = "0.2.*" +url = "1.2" + +[dependencies.libimagrt] +path = "../libimagrt" + +[dependencies.libimagmail] +path = "../libimagmail" + +[dependencies.libimagerror] +path = "../libimagerror" + +[dependencies.libimagutil] +path = "../libimagutil" + +[dependencies.libimagref] +path = "../libimagref" + diff --git a/imag-mail/README.md b/imag-mail/README.md new file mode 120000 index 00000000..d5d8fb01 --- /dev/null +++ b/imag-mail/README.md @@ -0,0 +1 @@ +../doc/src/04020-module-mails.md \ No newline at end of file diff --git a/imag-mail/src/main.rs b/imag-mail/src/main.rs new file mode 100644 index 00000000..bdd51bdb --- /dev/null +++ b/imag-mail/src/main.rs @@ -0,0 +1,151 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015, 2016 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 +// + +extern crate semver; +extern crate clap; +extern crate toml; +extern crate url; +#[macro_use] extern crate log; +#[macro_use] extern crate version; + +extern crate libimagrt; +extern crate libimagmail; +extern crate libimagerror; +extern crate libimagutil; +extern crate libimagref; + +use libimagerror::trace::{MapErrTrace, trace_error, trace_error_exit}; +use libimagmail::mail::Mail; +use libimagref::reference::Ref; +use libimagrt::runtime::Runtime; +use libimagrt::setup::generate_runtime_setup; +use libimagutil::debug_result::*; +use libimagutil::info_result::*; + +mod ui; + +use ui::build_ui; + +fn main() { + let rt = generate_runtime_setup("imag-mail", + &version!()[..], + "Mail collection tool", + build_ui); + + rt.cli() + .subcommand_name() + .map(|name| { + debug!("Call {}", name); + match name { + "import-mail" => import_mail(&rt), + "list" => list(&rt), + "mail-store" => mail_store(&rt), + _ => debug!("Unknown command") // More error handling + } + }); +} + +fn import_mail(rt: &Runtime) { + let scmd = rt.cli().subcommand_matches("import-mail").unwrap(); + let path = scmd.value_of("path").unwrap(); // enforced by clap + + Mail::import_from_path(rt.store(), path) + .map_err_trace() + .map_info_str("Ok"); +} + +fn list(rt: &Runtime) { + use libimagmail::error::MailErrorKind as MEK; + use libimagmail::error::MapErrInto; + + let scmd = rt.cli().subcommand_matches("list").unwrap(); + let do_check_dead = scmd.is_present("check-dead"); + let do_check_changed = scmd.is_present("check-changed"); + let do_check_changed_content = scmd.is_present("check-changed-content"); + let do_check_changed_permiss = scmd.is_present("check-changed-permissions"); + let store = rt.store(); + + let iter = match store.retrieve_for_module("ref") { + Ok(iter) => iter.filter_map(|id| { + Ref::get(store, id) + .map_err_into(MEK::RefHandlingError) + .and_then(|rf| Mail::from_ref(rf)) + .map_err_trace() + .ok() + }), + Err(e) => trace_error_exit(&e, 1), + }; + + fn list_mail(m: Mail) { + let id = match m.get_message_id() { + Ok(Some(f)) => f, + Ok(None) => "".to_owned(), + Err(e) => { + trace_error(&e); + "".to_owned() + }, + }; + + let from = match m.get_from() { + Ok(Some(f)) => f, + Ok(None) => "".to_owned(), + Err(e) => { + trace_error(&e); + "".to_owned() + }, + }; + + let to = match m.get_to() { + Ok(Some(f)) => f, + Ok(None) => "".to_owned(), + Err(e) => { + trace_error(&e); + "".to_owned() + }, + }; + + let subject = match m.get_subject() { + Ok(Some(f)) => f, + Ok(None) => "".to_owned(), + Err(e) => { + trace_error(&e); + "".to_owned() + }, + }; + + println!("Mail: {id}\n\tFrom: {from}\n\tTo: {to}\n\t{subj}\n", + from = from, + id = id, + subj = subject, + to = to + ); + } + + // TODO: Implement lister type in libimagmail for this + for mail in iter { + list_mail(mail) + } +} + +fn mail_store(rt: &Runtime) { + let scmd = rt.cli().subcommand_matches("mail-store").unwrap(); + error!("This feature is currently not implemented."); + unimplemented!() +} + diff --git a/imag-mail/src/ui.rs b/imag-mail/src/ui.rs new file mode 100644 index 00000000..3e999949 --- /dev/null +++ b/imag-mail/src/ui.rs @@ -0,0 +1,74 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015, 2016 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 +// + +use clap::{Arg, ArgGroup, App, SubCommand}; + +pub fn build_ui<'a>(app: App<'a, 'a>) -> App<'a, 'a> { + app + .subcommand(SubCommand::with_name("import-mail") + .about("Import a mail (create a reference to it) (Maildir)") + .version("0.1") + .arg(Arg::with_name("path") + .long("path") + .short("p") + .takes_value(true) + .required(true) + .help("Path to the mail file or a directory which is then searched recursively") + .value_name("PATH")) + ) + + .subcommand(SubCommand::with_name("list") + .about("List all stored references to mails") + .version("0.1") + + // TODO: Thee following four arguments are the same as in imag-ref. + // We should make these importable from libimagref. + + .arg(Arg::with_name("check-dead") + .long("check-dead") + .short("d") + .help("Check each reference whether it is dead")) + + .arg(Arg::with_name("check-changed") + .long("check-changed") + .short("c") + .help("Check whether a reference had changed (content or permissions)")) + + .arg(Arg::with_name("check-changed-content") + .long("check-changed-content") + .short("C") + .help("Check whether the content of the referenced file changed")) + + .arg(Arg::with_name("check-changed-permissions") + .long("check-changed-perms") + .short("P") + .help("Check whether the permissions of the referenced file changed")) + + ) + + .subcommand(SubCommand::with_name("mail-store") + .about("Operations on (subsets of) all mails") + .version("0.1") + .subcommand(SubCommand::with_name("update-refs") + .about("Create references based on Message-IDs for all loaded mails") + .version("0.1")) + // TODO: We really should be able to filter here. + ) +} +