1pub mod columns;
2pub mod file_object;
3pub mod object_store;
4
5use core::fmt;
6use std::fmt::Debug;
7use std::sync::Arc;
8
9pub use columns::*;
10pub use file_object::FileObjectTable;
11pub use object_store::ObjectStoreTable;
12
13pub struct TableRow<'a> {
14 data: Vec<(String, TableColumnValue)>,
15 print_fn: Option<&'a (dyn Fn(&TableRow) + 'a)>,
16}
17
18impl<'a> TableRow<'a> {
19 pub fn new(
20 data: Vec<(String, TableColumnValue)>,
21 print_fn: Option<&'a (dyn Fn(&TableRow) + 'a)>,
22 ) -> Self {
23 Self { data, print_fn }
24 }
25
26 pub fn data(&self) -> &[(String, TableColumnValue)] {
27 &self.data
28 }
29
30 pub fn print(&self) {
31 if let Some(print_fn) = self.print_fn {
32 print_fn(self); } else {
34 self.print_columns(); }
36 }
37
38 pub fn print_columns(&self) {
39 let values_to_print: Vec<String> = self
40 .data
41 .iter()
42 .map(|(_, value)| {
43 let value_str = match value {
44 TableColumnValue::Int32Column(val) => val.to_string(),
45 TableColumnValue::Uint64Column(val) => val.to_string(),
46 TableColumnValue::FloatColumn(val) => val.to_string(),
47 TableColumnValue::StringColumn(val) => val.clone(),
48 TableColumnValue::OptionalInt32Column(Some(val)) => {
49 val.to_string()
50 }
51 TableColumnValue::OptionalUint64Column(Some(val)) => {
52 val.to_string()
53 }
54 TableColumnValue::OptionalFloatColumn(Some(val)) => {
55 val.to_string()
56 }
57 TableColumnValue::OptionalStringColumn(Some(val)) => {
58 val.clone()
59 }
60 _ => "None".to_string(), };
62 format!("{}", value_str)
63 })
64 .collect();
65
66 println!("{}", values_to_print.join(","));
67 }
68}
69
70impl<'a> Clone for TableRow<'a> {
71 fn clone(&self) -> Self {
72 Self {
73 data: self.data.clone(),
74 print_fn: self.print_fn,
75 }
76 }
77}
78pub trait TableCallback: Send + Sync {
79 fn on_row_add(&self, row: &mut TableRow);
80}
81
82pub trait Table: Debug {
83 fn len(&self) -> usize;
84 fn add_column(&mut self, name: &str, column_type: Box<dyn TableColumn>);
85 fn set_callback(&mut self, callback: Arc<dyn TableCallback>);
86 fn add_row(
87 &mut self,
88 row_data: Vec<(String, TableColumnValue)>,
89 ) -> Result<(), String>;
90 fn fmt_debug(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
91}