aagt_core/infra/
notification.rs1use async_trait::async_trait;
2use serde::{Deserialize, Serialize};
3use crate::error::Result;
4
5#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
7#[serde(rename_all = "snake_case")]
8pub enum NotifyChannel {
9 Email,
11 Telegram,
13 Discord,
15 Webhook { url: String },
17 Log,
19}
20
21#[async_trait]
26pub trait Notifier: Send + Sync {
27 async fn notify(&self, channel: NotifyChannel, message: &str) -> Result<()>;
29}
30
31pub struct LogNotifier;
33
34#[async_trait]
35impl Notifier for LogNotifier {
36 async fn notify(&self, channel: NotifyChannel, message: &str) -> Result<()> {
37 let channel_name = match channel {
38 NotifyChannel::Email => "Email",
39 NotifyChannel::Telegram => "Telegram",
40 NotifyChannel::Discord => "Discord",
41 NotifyChannel::Webhook { .. } => "Webhook",
42 NotifyChannel::Log => "Log",
43 };
44 tracing::info!("[Notification via {}]: {}", channel_name, message);
45 Ok(())
46 }
47}