x_46ki75_notification_lib/
notification.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Serialize, Deserialize, Debug, Clone)]
4pub enum StageName {
5    #[serde(rename = "dev")]
6    Development,
7
8    #[serde(rename = "stg")]
9    Staging,
10
11    #[serde(rename = "prod")]
12    Production,
13}
14
15impl std::fmt::Display for StageName {
16    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17        write!(
18            f,
19            "{}",
20            String::from(match self {
21                StageName::Development => "dev",
22                StageName::Staging => "stg",
23                StageName::Production => "prod",
24            })
25        )
26    }
27}
28
29#[derive(Serialize, Deserialize, Debug, Default, Clone)]
30pub enum Status {
31    #[default]
32    #[serde(rename = "NEW")]
33    New,
34
35    #[serde(rename = "OPEN")]
36    Open,
37
38    #[serde(rename = "RESOLVED")]
39    Resolved,
40
41    #[serde(rename = "SUPPRESSED")]
42    Suppressed,
43}
44
45impl std::fmt::Display for Status {
46    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47        write!(
48            f,
49            "{}",
50            String::from(match self {
51                Status::New => "NEW",
52                Status::Open => "OPEN",
53                Status::Resolved => "RESOLVED",
54                Status::Suppressed => "SUPPRESSED",
55            })
56        )
57    }
58}
59
60impl<T> From<T> for Status
61where
62    T: AsRef<str>,
63{
64    fn from(value: T) -> Self {
65        match value.as_ref() {
66            "NEW" => Self::New,
67            "OPEN" => Self::Open,
68            "RESOLVE" => Self::Resolved,
69            "SUPPRESSED" => Self::Suppressed,
70            _ => Self::New,
71        }
72    }
73}
74
75#[derive(Serialize, Deserialize, Debug, Default, Clone)]
76pub enum Severity {
77    #[default]
78    #[serde(rename = "INFO")]
79    Info,
80
81    #[serde(rename = "WARN")]
82    Warn,
83
84    #[serde(rename = "ERROR")]
85    Error,
86}
87
88impl std::fmt::Display for Severity {
89    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
90        write!(
91            f,
92            "{}",
93            String::from(match self {
94                Severity::Info => "INFO",
95                Severity::Warn => "WARN",
96                Severity::Error => "ERROR",
97            })
98        )
99    }
100}
101
102impl<T> From<T> for Severity
103where
104    T: AsRef<str>,
105{
106    fn from(value: T) -> Self {
107        match value.as_ref() {
108            "INFO" => Self::Info,
109            "WARN" => Self::Warn,
110            "ERROR" => Self::Error,
111            _ => Self::Info,
112        }
113    }
114}
115
116#[derive(Serialize, Deserialize, Debug, Default, Clone)]
117pub struct Notification {
118    pub pk: String,
119    pub title: String,
120    pub details: Option<String>,
121    pub severity: Severity,
122    pub status: Status,
123    pub url: Option<String>,
124    pub notified_at: String,
125}
126
127// Request
128
129#[derive(Serialize, Deserialize, Debug, Clone)]
130pub enum Request {
131    #[serde(rename = "put")]
132    Put(PutCommand),
133
134    #[serde(rename = "list")]
135    List(ListCommand),
136
137    #[serde(rename = "delete")]
138    Delete(DeleteCommand),
139}
140
141#[derive(Serialize, Deserialize, Debug, Default, Clone)]
142pub struct PutCommand {
143    pub pk: Option<String>,
144    pub title: Option<String>,
145    pub details: Option<String>,
146    pub severity: Option<Severity>,
147    pub status: Option<Status>,
148    pub url: Option<String>,
149}
150
151#[derive(Serialize, Deserialize, Debug, Default, Clone)]
152pub struct ListCommand {
153    pub status: Vec<Status>,
154}
155
156#[derive(Serialize, Deserialize, Debug, Default, Clone)]
157pub struct DeleteCommand {
158    pub pk: String,
159}
160
161// Response
162
163#[derive(Serialize, Deserialize, Debug, Default, Clone)]
164pub struct Response {
165    pub results: Vec<Notification>,
166}