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}