rusticity_term/sqs/
trigger.rs1use 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}