Skip to main content

rusticity_term/sqs/
pipe.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 EventBridgePipe {
16    pub name: String,
17    pub status: String,
18    pub target: String,
19    pub last_modified: String,
20}
21
22#[derive(Debug, Clone, Copy, PartialEq)]
23pub enum Column {
24    Name,
25    Status,
26    Target,
27    LastModified,
28}
29
30impl Column {
31    const ID_NAME: &'static str = "column.sqs.pipe.name";
32    const ID_STATUS: &'static str = "column.sqs.pipe.status";
33    const ID_TARGET: &'static str = "column.sqs.pipe.target";
34    const ID_LAST_MODIFIED: &'static str = "column.sqs.pipe.last_modified";
35
36    pub const fn id(&self) -> ColumnId {
37        match self {
38            Column::Name => Self::ID_NAME,
39            Column::Status => Self::ID_STATUS,
40            Column::Target => Self::ID_TARGET,
41            Column::LastModified => Self::ID_LAST_MODIFIED,
42        }
43    }
44
45    pub const fn default_name(&self) -> &'static str {
46        match self {
47            Column::Name => "Pipe name",
48            Column::Status => "Status",
49            Column::Target => "Target",
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_NAME => Some(Column::Name),
61            Self::ID_STATUS => Some(Column::Status),
62            Self::ID_TARGET => Some(Column::Target),
63            Self::ID_LAST_MODIFIED => Some(Column::LastModified),
64            _ => None,
65        }
66    }
67
68    pub const fn all() -> [Column; 4] {
69        [
70            Column::Name,
71            Column::Status,
72            Column::Target,
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<EventBridgePipe> 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::Name => 40,
91            Column::Status => 15,
92            Column::Target => 60,
93            Column::LastModified => UTC_TIMESTAMP_WIDTH as usize,
94        }) as u16
95    }
96
97    fn render(&self, item: &EventBridgePipe) -> (String, Style) {
98        let text = match self {
99            Column::Name => item.name.clone(),
100            Column::Status => {
101                if item.status == "RUNNING" {
102                    format!("✅ {}", item.status)
103                } else {
104                    item.status.clone()
105                }
106            }
107            Column::Target => item.target.clone(),
108            Column::LastModified => format_unix_timestamp(&item.last_modified),
109        };
110        let style = match self {
111            Column::Status if item.status == "RUNNING" => 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.pipe."),
127                "Column ID '{}' should start with 'column.sqs.pipe.'",
128                col.id()
129            );
130        }
131    }
132}