ecb_rates/table/
table_ref.rs

1use std::fmt::Display;
2
3use crate::DEFAULT_WIDTH;
4use crate::cli::SortBy;
5use crate::models::ExchangeRateResult;
6
7use super::Table;
8use super::table_display::helper_table_print;
9use super::table_getter::TableGet;
10use super::table_trait::TableTrait;
11
12pub struct TableRef<'a> {
13    header: Option<&'a str>,
14    column_left: &'a str,
15    column_right: &'a str,
16    rows: Vec<(&'a str, f64)>,
17    pub color: bool,
18    pub width: usize,
19    pub left_offset: usize,
20}
21
22impl<'a> TableTrait<'a> for TableRef<'a> {
23    type Header = &'a str;
24    type ColumnLeft = &'a str;
25    type ColumnRight = &'a str;
26    type RowLeft = &'a str;
27
28    fn new(
29        header: Option<Self::Header>,
30        column_left: Self::ColumnLeft,
31        column_right: Self::ColumnRight,
32    ) -> Self {
33        Self {
34            header,
35            column_left,
36            column_right,
37            rows: Vec::new(),
38            color: false,
39            width: DEFAULT_WIDTH,
40            left_offset: 1,
41        }
42    }
43
44    fn disable_header(&mut self) {
45        self.header = None;
46    }
47
48    fn set_header(&mut self, header: Self::Header) {
49        self.header = Some(header);
50    }
51
52    fn add_row(&mut self, row_left: Self::RowLeft, row_right: f64) {
53        self.rows.push((row_left, row_right));
54    }
55
56    fn sort(&mut self, sort_by: &SortBy) {
57        let comparer = sort_by.get_comparer();
58        self.rows.sort_by(comparer);
59    }
60}
61
62impl<'a> TableGet for TableRef<'a> {
63    type RowLeftRef = &'a str;
64    type RowRightRef = &'a str;
65
66    fn get_header(&self) -> Option<&str> {
67        self.header
68    }
69    fn get_column_left(&self) -> &str {
70        self.column_left
71    }
72    fn get_column_right(&self) -> &str {
73        self.column_right
74    }
75    fn get_rows(&self) -> &Vec<(Self::RowLeftRef, f64)> {
76        &self.rows
77    }
78    fn get_width(&self) -> usize {
79        self.width
80    }
81
82    fn get_left_offset(&self) -> usize {
83        self.left_offset
84    }
85}
86
87impl<'a> From<&'a ExchangeRateResult> for TableRef<'a> {
88    fn from(value: &'a ExchangeRateResult) -> Self {
89        let mut table = TableRef::new(Some(&value.time), "Currency", "Rate");
90        for (key, val) in value.rates.iter() {
91            table.add_row(key, *val);
92        }
93
94        table
95    }
96}
97
98impl<'a> Display for TableRef<'a> {
99    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
100        helper_table_print(f, self)
101    }
102}
103
104impl<'a> From<&'a Table> for TableRef<'a> {
105    fn from(table: &'a Table) -> Self {
106        let rows = table
107            .rows
108            .iter()
109            .map(|(left, right)| (left.as_str(), *right))
110            .collect();
111
112        TableRef {
113            header: table.header.as_deref(),
114            column_left: table.column_left.as_str(),
115            column_right: table.column_right.as_str(),
116            rows,
117            color: table.color,
118            width: table.width,
119            left_offset: table.left_offset,
120        }
121    }
122}