rusticity_term/cw/
alarms.rs

1use crate::common::{ColumnTrait, UTC_TIMESTAMP_WIDTH};
2
3#[derive(Debug, Clone)]
4pub struct Alarm {
5    pub name: String,
6    pub state: String,
7    pub state_updated_timestamp: String,
8    pub description: String,
9    pub metric_name: String,
10    pub namespace: String,
11    pub statistic: String,
12    pub period: u32,
13    pub comparison_operator: String,
14    pub threshold: f64,
15    pub actions_enabled: bool,
16    pub state_reason: String,
17    pub resource: String,
18    pub dimensions: String,
19    pub expression: String,
20    pub alarm_type: String,
21    pub cross_account: String,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq)]
25pub enum AlarmColumn {
26    Name,
27    State,
28    LastStateUpdate,
29    Description,
30    Conditions,
31    Actions,
32    StateDetails,
33    MetricName,
34    Namespace,
35    Statistic,
36    Period,
37    Resource,
38    Dimensions,
39    Expression,
40    Type,
41    CrossAccount,
42}
43
44impl AlarmColumn {
45    pub fn name(&self) -> &'static str {
46        match self {
47            AlarmColumn::Name => "Name",
48            AlarmColumn::State => "State",
49            AlarmColumn::LastStateUpdate => "Last state update",
50            AlarmColumn::Description => "Description",
51            AlarmColumn::Conditions => "Conditions",
52            AlarmColumn::Actions => "Actions",
53            AlarmColumn::StateDetails => "State details",
54            AlarmColumn::MetricName => "Metric name",
55            AlarmColumn::Namespace => "Namespace",
56            AlarmColumn::Statistic => "Statistic",
57            AlarmColumn::Period => "Period",
58            AlarmColumn::Resource => "Resource",
59            AlarmColumn::Dimensions => "Dimensions",
60            AlarmColumn::Expression => "Expression",
61            AlarmColumn::Type => "Type",
62            AlarmColumn::CrossAccount => "Cross-account",
63        }
64    }
65
66    pub fn width(&self) -> u16 {
67        match self {
68            AlarmColumn::Name => 30,
69            AlarmColumn::State => 15,
70            AlarmColumn::LastStateUpdate => UTC_TIMESTAMP_WIDTH,
71            AlarmColumn::Description => 40,
72            AlarmColumn::Conditions => 30,
73            AlarmColumn::Actions => 20,
74            AlarmColumn::StateDetails => 30,
75            AlarmColumn::MetricName => 25,
76            AlarmColumn::Namespace => 20,
77            AlarmColumn::Statistic => 15,
78            AlarmColumn::Period => 10,
79            AlarmColumn::Resource => 25,
80            AlarmColumn::Dimensions => 25,
81            AlarmColumn::Expression => 30,
82            AlarmColumn::Type => 15,
83            AlarmColumn::CrossAccount => 15,
84        }
85    }
86
87    pub fn all() -> Vec<AlarmColumn> {
88        vec![
89            AlarmColumn::Name,
90            AlarmColumn::State,
91            AlarmColumn::LastStateUpdate,
92            AlarmColumn::Description,
93            AlarmColumn::Conditions,
94            AlarmColumn::Actions,
95            AlarmColumn::StateDetails,
96            AlarmColumn::MetricName,
97            AlarmColumn::Namespace,
98            AlarmColumn::Statistic,
99            AlarmColumn::Period,
100            AlarmColumn::Resource,
101            AlarmColumn::Dimensions,
102            AlarmColumn::Expression,
103            AlarmColumn::Type,
104            AlarmColumn::CrossAccount,
105        ]
106    }
107}
108
109impl ColumnTrait for AlarmColumn {
110    fn name(&self) -> &'static str {
111        self.name()
112    }
113}
114
115pub fn console_url(
116    region: &str,
117    view_mode: &str,
118    page_size: usize,
119    sort_col: &str,
120    sort_dir: &str,
121) -> String {
122    format!(
123        "https://{}.console.aws.amazon.com/cloudwatch/home?region={}#alarmsV2:alarms/{}/{}?~(sortingColumn~'{}~sortingDirection~'{})",
124        region, region, view_mode, page_size, sort_col, sort_dir
125    )
126}