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, Default)]
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, Default)]
53#[serde(rename_all = "lowercase")]
54pub enum WebhookPayloadMode {
55 #[default]
57 Template,
58 Raw,
60}
61
62#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
64#[serde(deny_unknown_fields)]
65#[serde(untagged)]
66pub enum TriggerTypeConfig {
67 Slack {
69 slack_url: SecretValue,
71 message: NotificationMessage,
73 #[serde(default)]
75 retry_policy: RetryConfig,
76 },
77 Email {
79 host: String,
81 port: Option<u16>,
83 username: SecretValue,
85 password: SecretValue,
87 message: NotificationMessage,
89 sender: EmailAddress,
91 recipients: Vec<EmailAddress>,
93 #[serde(default)]
95 retry_policy: RetryConfig,
96 },
97 Webhook {
99 url: SecretValue,
101 method: Option<String>,
103 secret: Option<SecretValue>,
105 headers: Option<std::collections::HashMap<String, String>>,
107 #[serde(default)]
109 message: NotificationMessage,
110 #[serde(default)]
112 payload_mode: WebhookPayloadMode,
113 #[serde(default)]
115 retry_policy: RetryConfig,
116 },
117 Telegram {
119 token: SecretValue,
121 chat_id: String,
123 disable_web_preview: Option<bool>,
125 message: NotificationMessage,
127 #[serde(default)]
129 retry_policy: RetryConfig,
130 },
131 Discord {
133 discord_url: SecretValue,
135 message: NotificationMessage,
137 #[serde(default)]
139 retry_policy: RetryConfig,
140 },
141 Script {
143 language: ScriptLanguage,
145 script_path: String,
147 #[serde(default)]
149 arguments: Option<Vec<String>>,
150 timeout_ms: u32,
152 },
153}
154
155impl TriggerTypeConfig {
156 pub fn get_retry_policy(&self) -> Option<RetryConfig> {
158 match self {
159 Self::Slack { retry_policy, .. } => Some(retry_policy.clone()),
160 Self::Discord { retry_policy, .. } => Some(retry_policy.clone()),
161 Self::Webhook { retry_policy, .. } => Some(retry_policy.clone()),
162 Self::Telegram { retry_policy, .. } => Some(retry_policy.clone()),
163 _ => None,
164 }
165 }
166}