Skip to main content

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    const ID_UUID: &'static str = "column.sqs.trigger.uuid";
32    const ID_ARN: &'static str = "column.sqs.trigger.arn";
33    const ID_STATUS: &'static str = "column.sqs.trigger.status";
34    const ID_LAST_MODIFIED: &'static str = "column.sqs.trigger.last_modified";
35
36    pub const fn id(&self) -> ColumnId {
37        match self {
38            Column::Uuid => Self::ID_UUID,
39            Column::Arn => Self::ID_ARN,
40            Column::Status => Self::ID_STATUS,
41            Column::LastModified => Self::ID_LAST_MODIFIED,
42        }
43    }
44
45    pub const fn default_name(&self) -> &'static str {
46        match self {
47            Column::Uuid => "UUID",
48            Column::Arn => "ARN",
49            Column::Status => "Status",
50            Column::LastModified => "Last modified",
51        }
52    }
53
54    pub fn name(&self) -> String {
55        translate_column(self.id(), self.default_name())
56    }
57
58    pub fn from_id(id: &str) -> Option<Self> {
59        match id {
60            Self::ID_UUID => Some(Column::Uuid),
61            Self::ID_ARN => Some(Column::Arn),
62            Self::ID_STATUS => Some(Column::Status),
63            Self::ID_LAST_MODIFIED => Some(Column::LastModified),
64            _ => None,
65        }
66    }
67
68    pub const fn all() -> [Column; 4] {
69        [
70            Column::Uuid,
71            Column::Arn,
72            Column::Status,
73            Column::LastModified,
74        ]
75    }
76
77    pub fn ids() -> Vec<ColumnId> {
78        Self::all().iter().map(|c| c.id()).collect()
79    }
80}
81
82impl TableColumn<LambdaTrigger> for Column {
83    fn name(&self) -> &str {
84        Box::leak(translate_column(self.id(), self.default_name()).into_boxed_str())
85    }
86
87    fn width(&self) -> u16 {
88        let translated = translate_column(self.id(), self.default_name());
89        translated.len().max(match self {
90            Column::Uuid => 40,
91            Column::Arn => 60,
92            Column::Status => 15,
93            Column::LastModified => UTC_TIMESTAMP_WIDTH as usize,
94        }) as u16
95    }
96
97    fn render(&self, item: &LambdaTrigger) -> (String, Style) {
98        let text = match self {
99            Column::Uuid => item.uuid.clone(),
100            Column::Arn => item.arn.clone(),
101            Column::Status => {
102                if item.status == "Enabled" {
103                    format!("✅ {}", item.status)
104                } else {
105                    item.status.clone()
106                }
107            }
108            Column::LastModified => format_unix_timestamp(&item.last_modified),
109        };
110        let style = match self {
111            Column::Status if item.status == "Enabled" => Style::default().fg(Color::Green),
112            _ => Style::default(),
113        };
114        (text, style)
115    }
116}
117
118#[cfg(test)]
119mod tests {
120    use super::*;
121
122    #[test]
123    fn test_column_ids_have_correct_prefix() {
124        for col in Column::all() {
125            assert!(
126                col.id().starts_with("column.sqs.trigger."),
127                "Column ID '{}' should start with 'column.sqs.trigger.'",
128                col.id()
129            );
130        }
131    }
132}