rusticity_term/sqs/
trigger.rs

1use crate::common::{format_unix_timestamp, translate_column, ColumnId, UTC_TIMESTAMP_WIDTH};
2use crate::ui::table::Column as TableColumn;
3use ratatui::prelude::*;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6
7pub fn init(i18n: &mut HashMap<String, String>) {
8    for col in Column::all() {
9        i18n.entry(col.id().to_string())
10            .or_insert_with(|| col.default_name().to_string());
11    }
12}
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
15pub struct LambdaTrigger {
16    pub uuid: String,
17    pub arn: String,
18    pub status: String,
19    pub last_modified: String,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq)]
23pub enum Column {
24    Uuid,
25    Arn,
26    Status,
27    LastModified,
28}
29
30impl Column {
31    pub fn id(&self) -> ColumnId {
32        match self {
33            Column::Uuid => "column.sqs.trigger.uuid",
34            Column::Arn => "column.sqs.trigger.arn",
35            Column::Status => "column.sqs.trigger.status",
36            Column::LastModified => "column.sqs.trigger.last_modified",
37        }
38    }
39
40    pub fn default_name(&self) -> &'static str {
41        match self {
42            Column::Uuid => "UUID",
43            Column::Arn => "ARN",
44            Column::Status => "Status",
45            Column::LastModified => "Last modified",
46        }
47    }
48
49    pub fn name(&self) -> String {
50        translate_column(self.id(), self.default_name())
51    }
52
53    pub fn from_id(id: &str) -> Option<Self> {
54        match id {
55            "column.sqs.trigger.uuid" => Some(Column::Uuid),
56            "column.sqs.trigger.arn" => Some(Column::Arn),
57            "column.sqs.trigger.status" => Some(Column::Status),
58            "column.sqs.trigger.last_modified" => Some(Column::LastModified),
59            _ => None,
60        }
61    }
62
63    pub fn all() -> [Column; 4] {
64        [
65            Column::Uuid,
66            Column::Arn,
67            Column::Status,
68            Column::LastModified,
69        ]
70    }
71
72    pub fn ids() -> Vec<ColumnId> {
73        Self::all().iter().map(|c| c.id()).collect()
74    }
75}
76
77impl TableColumn<LambdaTrigger> for Column {
78    fn name(&self) -> &str {
79        Box::leak(translate_column(self.id(), self.default_name()).into_boxed_str())
80    }
81
82    fn width(&self) -> u16 {
83        let translated = translate_column(self.id(), self.default_name());
84        translated.len().max(match self {
85            Column::Uuid => 40,
86            Column::Arn => 60,
87            Column::Status => 15,
88            Column::LastModified => UTC_TIMESTAMP_WIDTH as usize,
89        }) as u16
90    }
91
92    fn render(&self, item: &LambdaTrigger) -> (String, Style) {
93        let text = match self {
94            Column::Uuid => item.uuid.clone(),
95            Column::Arn => item.arn.clone(),
96            Column::Status => {
97                if item.status == "Enabled" {
98                    format!("✅ {}", item.status)
99                } else {
100                    item.status.clone()
101                }
102            }
103            Column::LastModified => format_unix_timestamp(&item.last_modified),
104        };
105        let style = match self {
106            Column::Status if item.status == "Enabled" => Style::default().fg(Color::Green),
107            _ => Style::default(),
108        };
109        (text, style)
110    }
111}
112
113#[cfg(test)]
114mod tests {
115    use super::*;
116
117    #[test]
118    fn test_column_ids_have_correct_prefix() {
119        for col in Column::all() {
120            assert!(
121                col.id().starts_with("column.sqs.trigger."),
122                "Column ID '{}' should start with 'column.sqs.trigger.'",
123                col.id()
124            );
125        }
126    }
127}