lumni/table/
mod.rs

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); // custom print function
33        } else {
34            self.print_columns(); // default print function
35        }
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(), // Handle None cases for Optional values
61                };
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}