openzeppelin_monitor/models/core/
trigger.rs1use crate::{
2 models::{core::ScriptLanguage, SecretValue},
3 utils::HttpRetryConfig,
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: HttpRetryConfig,
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 },
83 Webhook {
85 url: SecretValue,
87 method: Option<String>,
89 secret: Option<SecretValue>,
91 headers: Option<std::collections::HashMap<String, String>>,
93 message: NotificationMessage,
95 #[serde(default)]
97 retry_policy: HttpRetryConfig,
98 },
99 Telegram {
101 token: SecretValue,
103 chat_id: String,
105 disable_web_preview: Option<bool>,
107 message: NotificationMessage,
109 #[serde(default)]
111 retry_policy: HttpRetryConfig,
112 },
113 Discord {
115 discord_url: SecretValue,
117 message: NotificationMessage,
119 #[serde(default)]
121 retry_policy: HttpRetryConfig,
122 },
123 Script {
125 language: ScriptLanguage,
127 script_path: String,
129 #[serde(default)]
131 arguments: Option<Vec<String>>,
132 timeout_ms: u32,
134 },
135}
136
137impl TriggerTypeConfig {
138 pub fn get_retry_policy(&self) -> Option<HttpRetryConfig> {
140 match self {
141 Self::Slack { retry_policy, .. } => Some(retry_policy.clone()),
142 Self::Discord { retry_policy, .. } => Some(retry_policy.clone()),
143 Self::Webhook { retry_policy, .. } => Some(retry_policy.clone()),
144 Self::Telegram { retry_policy, .. } => Some(retry_policy.clone()),
145 _ => None,
146 }
147 }
148}