diff options
Diffstat (limited to 'src/actions')
-rw-r--r-- | src/actions/mod.rs | 121 |
1 files changed, 0 insertions, 121 deletions
diff --git a/src/actions/mod.rs b/src/actions/mod.rs deleted file mode 100644 index bf78414..0000000 --- a/src/actions/mod.rs +++ /dev/null @@ -1,121 +0,0 @@ -use std::fmt; - -use anyhow::Result; -use async_trait::async_trait; -use log::{debug, info, warn}; -use serde::Deserialize; - -use crate::message::MessageConfig; -use crate::message::MessageParams; - -mod command; -#[cfg(feature = "desktop")] -mod desktop_notification; -#[cfg(feature = "email")] -mod email; -#[cfg(feature = "nostr")] -mod nostr; -#[cfg(feature = "ntfy")] -mod ntfy; -#[cfg(feature = "telegram")] -mod telegram; -mod terminal_print; - -#[derive(Deserialize, Debug)] -#[serde(rename_all = "snake_case")] -#[serde(tag = "type")] -pub enum AnyActionConfig { - TerminalPrint, - Command(self::command::CommandConfig), - #[cfg(feature = "desktop")] - DesktopNotification, - #[cfg(feature = "ntfy")] - Ntfy(self::ntfy::NtfyConfig), - #[cfg(feature = "email")] - Email(self::email::EmailConfig), - #[cfg(feature = "telegram")] - Telegram(self::telegram::TelegramConfig), - #[cfg(feature = "nostr")] - Nostr(self::nostr::NostrConfig), -} - -impl fmt::Display for AnyActionConfig { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - AnyActionConfig::TerminalPrint => write!(f, "terminal_print"), - AnyActionConfig::Command(_) => write!(f, "command"), - #[cfg(feature = "desktop")] - AnyActionConfig::DesktopNotification => write!(f, "desktop_notification"), - #[cfg(feature = "ntfy")] - AnyActionConfig::Ntfy(_) => write!(f, "ntfy"), - #[cfg(feature = "email")] - AnyActionConfig::Email(_) => write!(f, "email"), - #[cfg(feature = "telegram")] - AnyActionConfig::Telegram(_) => write!(f, "telegram"), - #[cfg(feature = "nostr")] - AnyActionConfig::Nostr(_) => write!(f, "nostr"), - } - } -} - -#[async_trait] -pub trait Action<'a> { - async fn run(&self, params: Option<&MessageParams<'_, '_>>) -> Result<()>; -} - -pub async fn get_action<'a>( - message_config: &'a MessageConfig, - action_config: &'a AnyActionConfig, -) -> Result<Box<dyn Action<'a> + 'a + Sync>> { - Ok(match action_config { - AnyActionConfig::TerminalPrint => Box::new(self::terminal_print::TerminalPrintAction::new( - message_config, - )), - AnyActionConfig::Command(config) => { - Box::new(self::command::CommandAction::new(message_config, config)?) - } - #[cfg(feature = "desktop")] - AnyActionConfig::DesktopNotification => Box::new( - self::desktop_notification::DesktopNotificationAction::new(message_config), - ), - #[cfg(feature = "ntfy")] - AnyActionConfig::Ntfy(config) => { - Box::new(self::ntfy::NtfyAction::new(message_config, config)?) - } - #[cfg(feature = "email")] - AnyActionConfig::Email(config) => { - Box::new(self::email::EmailAction::new(message_config, config)?) - } - #[cfg(feature = "telegram")] - AnyActionConfig::Telegram(config) => { - Box::new(self::telegram::TelegramAction::new(message_config, config)?) - } - #[cfg(feature = "nostr")] - AnyActionConfig::Nostr(config) => { - Box::new(self::nostr::NostrAction::new(message_config, config).await?) - } - }) -} - -pub async fn get_actions<'a>( - message_config: &'a MessageConfig, - actions_config: &'a [AnyActionConfig], -) -> Vec<Box<dyn Action<'a> + 'a + Sync>> { - let mut result: Vec<Box<dyn Action + Sync>> = Default::default(); - - // TODO: parallelize this. It's hard because the result vector needs to be shared. - for action_config in actions_config { - debug!("registering action '{}'", action_config); - match get_action(message_config, action_config).await { - Ok(action) => { - info!("registered action '{}'", action_config); - result.push(action); - } - Err(e) => { - warn!("could not register action '{}': {}", action_config, e); - } - } - } - - result -} |