rusticity_term/cw/
logs.rs

1use crate::common::UTC_TIMESTAMP_WIDTH;
2
3pub fn console_url_list(region: &str) -> String {
4    format!(
5        "https://{}.console.aws.amazon.com/cloudwatch/home?region={}#logsV2:log-groups",
6        region, region
7    )
8}
9
10pub fn console_url_detail(region: &str, group_name: &str) -> String {
11    let encoded_group = urlencoding::encode(group_name);
12    format!(
13        "https://{}.console.aws.amazon.com/cloudwatch/home?region={}#logsV2:log-groups/log-group/{}",
14        region, region, encoded_group
15    )
16}
17
18pub fn console_url_stream(region: &str, group_name: &str, stream_name: &str) -> String {
19    let encoded_group = urlencoding::encode(group_name);
20    let encoded_stream = urlencoding::encode(stream_name);
21    format!(
22        "https://{}.console.aws.amazon.com/cloudwatch/home?region={}#logsV2:log-groups/log-group/{}/log-events/{}",
23        region, region, encoded_group, encoded_stream
24    )
25}
26
27#[derive(Debug, Clone, Copy, PartialEq)]
28pub enum StreamColumn {
29    LogStream,
30    ARN,
31    CreationTime,
32    FirstEventTime,
33    LastEventTime,
34    LastIngestionTime,
35    UploadSequenceToken,
36}
37
38impl StreamColumn {
39    pub fn name(&self) -> &'static str {
40        match self {
41            StreamColumn::LogStream => "Log stream",
42            StreamColumn::ARN => "ARN",
43            StreamColumn::CreationTime => "Creation time",
44            StreamColumn::FirstEventTime => "First event time",
45            StreamColumn::LastEventTime => "Last event time",
46            StreamColumn::LastIngestionTime => "Last ingestion time",
47            StreamColumn::UploadSequenceToken => "Upload sequence token",
48        }
49    }
50
51    pub fn width(&self) -> u16 {
52        match self {
53            StreamColumn::LogStream => 50,
54            StreamColumn::ARN => 80,
55            StreamColumn::CreationTime => UTC_TIMESTAMP_WIDTH,
56            StreamColumn::FirstEventTime => UTC_TIMESTAMP_WIDTH,
57            StreamColumn::LastEventTime => UTC_TIMESTAMP_WIDTH,
58            StreamColumn::LastIngestionTime => UTC_TIMESTAMP_WIDTH,
59            StreamColumn::UploadSequenceToken => 30,
60        }
61    }
62
63    pub fn all() -> Vec<StreamColumn> {
64        vec![
65            StreamColumn::LogStream,
66            StreamColumn::ARN,
67            StreamColumn::CreationTime,
68            StreamColumn::FirstEventTime,
69            StreamColumn::LastEventTime,
70            StreamColumn::LastIngestionTime,
71            StreamColumn::UploadSequenceToken,
72        ]
73    }
74}
75
76#[derive(Debug, Clone, Copy, PartialEq)]
77pub enum EventColumn {
78    Timestamp,
79    IngestionTime,
80    Message,
81    EventId,
82    LogStreamName,
83}
84
85impl EventColumn {
86    pub fn name(&self) -> &'static str {
87        match self {
88            EventColumn::Timestamp => "Timestamp",
89            EventColumn::IngestionTime => "Ingestion time",
90            EventColumn::Message => "Message",
91            EventColumn::EventId => "Event ID",
92            EventColumn::LogStreamName => "Log stream name",
93        }
94    }
95
96    pub fn width(&self) -> u16 {
97        match self {
98            EventColumn::Timestamp => UTC_TIMESTAMP_WIDTH,
99            EventColumn::IngestionTime => UTC_TIMESTAMP_WIDTH,
100            EventColumn::Message => 0, // Min constraint
101            EventColumn::EventId => 40,
102            EventColumn::LogStreamName => 50,
103        }
104    }
105
106    pub fn all() -> Vec<EventColumn> {
107        vec![
108            EventColumn::Timestamp,
109            EventColumn::IngestionTime,
110            EventColumn::Message,
111            EventColumn::EventId,
112            EventColumn::LogStreamName,
113        ]
114    }
115}
116
117#[cfg(test)]
118mod tests {
119    use super::*;
120
121    #[test]
122    fn test_stream_column_all_returns_seven_columns() {
123        let columns = StreamColumn::all();
124        assert_eq!(columns.len(), 7);
125    }
126
127    #[test]
128    fn test_event_column_all_returns_five_columns() {
129        let columns = EventColumn::all();
130        assert_eq!(columns.len(), 5);
131    }
132}