ecb_rates/table/
table_ref.rs1use 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}