pub mod error;
pub trait TableRow {
fn get_fields() -> Vec<&'static str>;
fn get_field_types() -> Vec<&'static str>;
fn field_count() -> usize { Self::get_fields().iter().count() }
}
pub trait Table<Row: TableRow> {
fn get_column_size<ColumnType: ToString>(&self, column: fn(&Row) -> ColumnType) -> Option<usize> {
let mut sizes: Vec<usize> = Vec::new();
for row in self.get_rows() {
let col = column(row);
let size = get_size(col);
sizes.push(size);
}
match sizes.iter().max() {
Some(max) => Some(max.to_owned()),
None => None
}
}
fn new() -> Self;
fn from_vec(vec: &Vec<Row>) -> Self;
fn get_rows(&self) -> &Vec<Row>;
fn get_rows_mut(&mut self) -> &mut Vec<Row>;
fn push(&mut self, row: Row) { self.get_rows_mut().push(row); }
fn insert_top(&mut self, row: Row) { self.get_rows_mut().insert(0, row); }
fn insert(&mut self, i: usize, row: Row) { self.get_rows_mut().insert(i, row); }
fn get_column<ColumnType>(
&self,
column: fn(&Row) -> ColumnType
)
-> Vec<ColumnType>
{
let columns: Vec<ColumnType> = self.get_rows().to_owned().into_iter().map(|row| {
column(row)
}).collect();
columns
}
fn get_row_at(&self, i: usize) -> Option<&Row> { self.get_rows().get(i) }
fn rm_row_at(&mut self, i: usize) -> Row {
self.get_rows_mut().remove(i)
}
fn column_count(&self) -> usize { Row::field_count() }
fn row_count(&self) -> usize { self.get_rows().len() }
}
pub trait IdTable<UidType: PartialEq, Row: TableRow>: Table<Row> {
fn get_id_from_row(row: &Row) -> UidType;
fn get_row(&self, uid: UidType) -> Option<&Row> {
let val: Option<&Row> = self.get_rows().iter().find_map(|row| {
if Self::get_id_from_row(row) == uid {
Some(row)
} else {
None
}
});
val
}
fn get_row_mut(&mut self, uid: UidType) -> Option<&mut Row> {
let val: Option<&mut Row> = self.get_rows_mut().iter_mut().find_map(|row| {
if Self::get_id_from_row(row) == uid {
Some(row)
} else {
None
}
});
val
}
fn get_row_index(&self, uid: UidType) -> Option<usize> {
let val: Option<usize> = self.get_rows().iter().enumerate().find_map(|(i, row)| {
if Self::get_id_from_row(row) == uid {
Some(i)
} else {
None
}
});
val
}
fn rm_row(&mut self, uid: UidType) -> Result<Row, crate::error::TableError> {
if let Some(index) = self.get_row_index(uid) {
Ok(self.rm_row_at(index))
} else {
Err(crate::error::TableError { kind: crate::error::TableErrorKind::CouldNotRemove, message: "There is no table row with this uid".to_string() })
}
}
}
fn get_size<Type: ToString>(var: Type) -> usize {
let len = var.to_string().chars().into_iter().count();
len
}