rusticity_term/ecr/
image.rs

1use crate::common::{format_iso_timestamp, ColumnTrait, UTC_TIMESTAMP_WIDTH};
2use crate::ui::table::Column as TableColumn;
3use ratatui::prelude::*;
4
5#[derive(Debug, Clone)]
6pub struct Image {
7    pub tag: String,
8    pub artifact_type: String,
9    pub pushed_at: String,
10    pub size_bytes: i64,
11    pub uri: String,
12    pub digest: String,
13    pub last_pull_time: String,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq)]
17pub enum Column {
18    Tag,
19    ArtifactType,
20    PushedAt,
21    SizeMb,
22    Uri,
23    Digest,
24    LastPullTime,
25}
26
27impl Column {
28    pub fn all() -> Vec<Column> {
29        vec![
30            Column::Tag,
31            Column::ArtifactType,
32            Column::PushedAt,
33            Column::SizeMb,
34            Column::Uri,
35            Column::Digest,
36            Column::LastPullTime,
37        ]
38    }
39}
40
41impl ColumnTrait for Column {
42    fn name(&self) -> &'static str {
43        match self {
44            Column::Tag => "Image tag",
45            Column::ArtifactType => "Artifact type",
46            Column::PushedAt => "Pushed at",
47            Column::SizeMb => "Size (MB)",
48            Column::Uri => "Image URI",
49            Column::Digest => "Digest",
50            Column::LastPullTime => "Last recorded pull time",
51        }
52    }
53}
54
55impl TableColumn<Image> for Column {
56    fn name(&self) -> &str {
57        ColumnTrait::name(self)
58    }
59
60    fn width(&self) -> u16 {
61        ColumnTrait::name(self).len().max(match self {
62            Column::Tag => 20,
63            Column::ArtifactType => 20,
64            Column::PushedAt => UTC_TIMESTAMP_WIDTH as usize,
65            Column::SizeMb => 12,
66            Column::Uri => 50,
67            Column::Digest => 20,
68            Column::LastPullTime => UTC_TIMESTAMP_WIDTH as usize,
69        }) as u16
70    }
71
72    fn render(&self, item: &Image) -> (String, Style) {
73        let text = match self {
74            Column::Tag => item.tag.clone(),
75            Column::ArtifactType => item.artifact_type.clone(),
76            Column::PushedAt => format_iso_timestamp(&item.pushed_at),
77            Column::SizeMb => crate::common::format_bytes(item.size_bytes),
78            Column::Uri => item.uri.clone(),
79            Column::Digest => item.digest.clone(),
80            Column::LastPullTime => format_iso_timestamp(&item.last_pull_time),
81        };
82        (text, Style::default())
83    }
84}