openzeppelin_monitor/models/core/
trigger.rs1use crate::{
2 models::{core::ScriptLanguage, SecretValue},
3 utils::RetryConfig,
4};
5use email_address::EmailAddress;
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
10#[serde(deny_unknown_fields)]
11pub struct Trigger {
12 pub name: String,
14
15 pub trigger_type: TriggerType,
17
18 pub config: TriggerTypeConfig,
20}
21
22#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
24#[serde(rename_all = "lowercase")]
25#[serde(deny_unknown_fields)]
26pub enum TriggerType {
27 Slack,
29 Email,
31 Webhook,
33 Telegram,
35 Discord,
37 Script,
39}
40
41#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
43#[serde(deny_unknown_fields)]
44pub struct NotificationMessage {
45 pub title: String,
47 pub body: String,
49}
50
51#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
53#[serde(deny_unknown_fields)]
54#[serde(untagged)]
55pub enum TriggerTypeConfig {
56 Slack {
58 slack_url: SecretValue,
60 message: NotificationMessage,
62 #[serde(default)]
64 retry_policy: RetryConfig,
65 },
66 Email {
68 host: String,
70 port: Option<u16>,
72 username: SecretValue,
74 password: SecretValue,
76 message: NotificationMessage,
78 sender: EmailAddress,
80 recipients: Vec<EmailAddress>,
82 #[serde(default)]
84 retry_policy: RetryConfig,
85 },
86 Webhook {
88 url: SecretValue,
90 method: Option<String>,
92 secret: Option<SecretValue>,
94 headers: Option<std::collections::HashMap<String, String>>,
96 message: NotificationMessage,
98 #[serde(default)]
100 retry_policy: RetryConfig,
101 },
102 Telegram {
104 token: SecretValue,
106 chat_id: String,
108 disable_web_preview: Option<bool>,
110 message: NotificationMessage,
112 #[serde(default)]
114 retry_policy: RetryConfig,
115 },
116 Discord {
118 discord_url: SecretValue,
120 message: NotificationMessage,
122 #[serde(default)]
124 retry_policy: RetryConfig,
125 },
126 Script {
128 language: ScriptLanguage,
130 script_path: String,
132 #[serde(default)]
134 arguments: Option<Vec<String>>,
135 timeout_ms: u32,
137 },
138}
139
140impl TriggerTypeConfig {
141 pub fn get_retry_policy(&self) -> Option<RetryConfig> {
143 match self {
144 Self::Slack { retry_policy, .. } => Some(retry_policy.clone()),
145 Self::Discord { retry_policy, .. } => Some(retry_policy.clone()),
146 Self::Webhook { retry_policy, .. } => Some(retry_policy.clone()),
147 Self::Telegram { retry_policy, .. } => Some(retry_policy.clone()),
148 _ => None,
149 }
150 }
151}