rusticity_term/ecr/
repo.rs1use crate::common::translate_column;
2use crate::common::{format_iso_timestamp, ColumnId, UTC_TIMESTAMP_WIDTH};
3use crate::ui::table::Column as TableColumn;
4use ratatui::prelude::*;
5use std::collections::HashMap;
6
7pub fn init(i18n: &mut HashMap<String, String>) {
8 for col in [
9 Column::Name,
10 Column::Uri,
11 Column::CreatedAt,
12 Column::TagImmutability,
13 Column::EncryptionType,
14 ] {
15 i18n.entry(col.id().to_string())
16 .or_insert_with(|| col.default_name().to_string());
17 }
18}
19
20#[derive(Debug, Clone)]
21pub struct Repository {
22 pub name: String,
23 pub uri: String,
24 pub created_at: String,
25 pub tag_immutability: String,
26 pub encryption_type: String,
27}
28
29#[derive(Debug, Clone, Copy, PartialEq)]
30pub enum Column {
31 Name,
32 Uri,
33 CreatedAt,
34 TagImmutability,
35 EncryptionType,
36}
37
38impl Column {
39 pub fn id(&self) -> &'static str {
40 match self {
41 Column::Name => "column.ecr.repo.name",
42 Column::Uri => "column.ecr.repo.uri",
43 Column::CreatedAt => "column.ecr.repo.created_at",
44 Column::TagImmutability => "column.ecr.repo.tag_immutability",
45 Column::EncryptionType => "column.ecr.repo.encryption_type",
46 }
47 }
48
49 pub fn default_name(&self) -> &'static str {
50 match self {
51 Column::Name => "Repository name",
52 Column::Uri => "URI",
53 Column::CreatedAt => "Created at",
54 Column::TagImmutability => "Tag immutability",
55 Column::EncryptionType => "Encryption type",
56 }
57 }
58
59 pub fn all() -> [Column; 5] {
60 [
61 Column::Name,
62 Column::Uri,
63 Column::CreatedAt,
64 Column::TagImmutability,
65 Column::EncryptionType,
66 ]
67 }
68
69 pub fn ids() -> Vec<ColumnId> {
70 Self::all().iter().map(|c| c.id()).collect()
71 }
72
73 pub fn from_id(id: &str) -> Option<Self> {
74 match id {
75 "column.ecr.repo.name" => Some(Column::Name),
76 "column.ecr.repo.uri" => Some(Column::Uri),
77 "column.ecr.repo.created_at" => Some(Column::CreatedAt),
78 "column.ecr.repo.tag_immutability" => Some(Column::TagImmutability),
79 "column.ecr.repo.encryption_type" => Some(Column::EncryptionType),
80 _ => None,
81 }
82 }
83
84 pub fn name(&self) -> String {
85 translate_column(self.id(), self.default_name())
86 }
87}
88
89impl TableColumn<Repository> for Column {
90 fn name(&self) -> &str {
91 Box::leak(translate_column(self.id(), self.default_name()).into_boxed_str())
92 }
93
94 fn width(&self) -> u16 {
95 let translated = translate_column(self.id(), self.default_name());
96 translated.len().max(match self {
97 Column::Name => 30,
98 Column::Uri => 50,
99 Column::CreatedAt => UTC_TIMESTAMP_WIDTH as usize,
100 Column::TagImmutability => 18,
101 Column::EncryptionType => 18,
102 }) as u16
103 }
104
105 fn render(&self, item: &Repository) -> (String, Style) {
106 let text = match self {
107 Column::Name => item.name.clone(),
108 Column::Uri => item.uri.clone(),
109 Column::CreatedAt => format_iso_timestamp(&item.created_at),
110 Column::TagImmutability => item.tag_immutability.clone(),
111 Column::EncryptionType => match item.encryption_type.as_str() {
112 "AES256" => "AES-256".to_string(),
113 "KMS" => "KMS".to_string(),
114 other => other.to_string(),
115 },
116 };
117 (text, Style::default())
118 }
119}
120
121#[cfg(test)]
122mod tests {
123 use super::*;
124
125 #[test]
126 fn test_column_ids_have_correct_prefix() {
127 for col in Column::all() {
128 assert!(
129 col.id().starts_with("column.ecr.repo."),
130 "Column ID '{}' should start with 'column.ecr.repo.'",
131 col.id()
132 );
133 }
134 }
135}