diff options
Diffstat (limited to 'lib/domain/libimagmail/src/config.rs')
-rw-r--r-- | lib/domain/libimagmail/src/config.rs | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/lib/domain/libimagmail/src/config.rs b/lib/domain/libimagmail/src/config.rs new file mode 100644 index 00000000..6258e6e3 --- /dev/null +++ b/lib/domain/libimagmail/src/config.rs @@ -0,0 +1,136 @@ +// +// imag - the personal information management suite for the commandline +// Copyright (C) 2015-2019 Matthias Beyer <mail@beyermatthias.de> 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 std::path::PathBuf; + +/// A struct representing a full mail configuration, required for working with this library +/// +/// For convenience reasons, this implements Serialize and Deserialize, so it can be fetched from a +/// configuration file for example +/// +/// # TODO +/// +/// Figure out how to use handlebars with variables on this. Right now the support for that is not +/// implemented yet. +/// +#[derive(Serialize, Deserialize, Debug)] +pub struct MailConfig { + default_account : String, + accounts : Vec<MailAccountConfig>, + fetchcommand : MailCommand, + postfetchcommand : Option<MailCommand>, + sendcommand : MailCommand, + postsendcommand : Option<MailCommand>, +} + +impl MailConfig { + pub fn default_account(&self) -> &String { + &self.default_account + } + + pub fn accounts(&self) -> &Vec<MailAccountConfig> { + &self.accounts + } + + pub fn account(&self, name: &str) -> Option<&MailAccountConfig> { + self.accounts() + .iter() + .filter(|a| a.name == name) + .next() + } + + pub fn fetchcommand(&self) -> &MailCommand { + &self.fetchcommand + } + + pub fn postfetchcommand(&self) -> Option<&MailCommand> { + self.postfetchcommand.as_ref() + } + + pub fn sendcommand(&self) -> &MailCommand { + &self.sendcommand + } + + pub fn postsendcommand(&self) -> Option<&MailCommand> { + self.postsendcommand.as_ref() + } + + pub fn fetchcommand_for_account(&self, account_name: &str) -> &MailCommand { + self.accounts() + .iter() + .filter(|a| a.name == account_name) + .next() + .and_then(|a| a.fetchcommand.as_ref()) + .unwrap_or_else(|| self.fetchcommand()) + } + + pub fn postfetchcommand_for_account(&self, account_name: &str) -> Option<&MailCommand> { + self.accounts() + .iter() + .filter(|a| a.name == account_name) + .next() + .and_then(|a| a.postfetchcommand.as_ref()) + .or_else(|| self.postfetchcommand()) + } + + pub fn sendcommand_for_account(&self, account_name: &str) -> &MailCommand { + self.accounts() + .iter() + .filter(|a| a.name == account_name) + .next() + .and_then(|a| a.sendcommand.as_ref()) + .unwrap_or_else(|| self.sendcommand()) + } + + pub fn postsendcommand_for_account(&self, account_name: &str) -> Option<&MailCommand> { + self.accounts() + .iter() + .filter(|a| a.name == account_name) + .next() + .and_then(|a| a.postsendcommand.as_ref()) + .or_else(|| self.postsendcommand()) + } + +} + +/// A configuration for a single mail accounts +/// +/// If one of the keys `fetchcommand`, `postfetchcommand`, `sendcommand` or `postsendcommand` is +/// not available, the implementation of the `MailConfig` will automatically use the global +/// configuration if applicable. +#[derive(Serialize, Deserialize, Debug)] +pub struct MailAccountConfig { + pub name : String, + pub outgoingbox : PathBuf, + pub draftbox : PathBuf, + pub sentbox : PathBuf, + pub maildirroot : PathBuf, + pub fetchcommand : Option<MailCommand>, + pub postfetchcommand : Option<MailCommand>, + pub sendcommand : Option<MailCommand>, + pub postsendcommand : Option<MailCommand>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct MailCommand { + command: String, + env: Vec<String>, + args: Vec<String>, +} + |