110 lines
2.8 KiB
Rust
110 lines
2.8 KiB
Rust
use chrono::{Local, TimeZone};
|
|
use comfy_table::{presets::UTF8_NO_BORDERS, ContentArrangement, Row, Table};
|
|
use libjens::api::{Category, Meme, User};
|
|
|
|
// pub trait AsTableRow {
|
|
// fn as_table_row(&self) -> term_table::row::Row;
|
|
//}
|
|
// impl AsTableRow for Category {
|
|
// fn as_table_row(&self) -> Row<'_> {
|
|
// Row::new(vec![TableCell::new(&self.id), TableCell::new(&self.name)])
|
|
// }
|
|
//}
|
|
// impl AsTableRow for Meme {
|
|
// fn as_table_row(&self) -> Row<'_> {
|
|
// Row::new(vec![
|
|
// TableCell::new(&self.link),
|
|
// TableCell::new(&self.category),
|
|
// TableCell::new(&self.user),
|
|
// TableCell::new(Local.timestamp(self.timestamp, 0).format("%F
|
|
// %R")), TableCell::new(&self.id),
|
|
// ])
|
|
// }
|
|
//}
|
|
// impl AsTableRow for User {
|
|
// fn as_table_row(&self) -> Row<'_> {
|
|
// Row::new(vec![
|
|
// TableCell::new(&self.name),
|
|
// TableCell::new(&self.get_id().map(String::as_ref).unwrap_or("[No
|
|
// ID]")), TableCell::new(&self.dayuploads),
|
|
// ])
|
|
// }
|
|
//}
|
|
|
|
pub fn list_table() -> Table {
|
|
let mut table = Table::new();
|
|
|
|
table
|
|
.load_preset(UTF8_NO_BORDERS)
|
|
.set_content_arrangement(ContentArrangement::Dynamic);
|
|
|
|
table
|
|
}
|
|
|
|
pub trait TableHeader {
|
|
fn header() -> Row;
|
|
}
|
|
|
|
macro_rules! impl_table_header {
|
|
($t:ident, $e:expr) => {
|
|
impl TableHeader for $t {
|
|
fn header() -> Row {
|
|
$e.into()
|
|
}
|
|
}
|
|
};
|
|
}
|
|
|
|
impl_table_header!(User, vec!["Name", "ID"]);
|
|
impl_table_header!(Category, vec!["Name", "ID"]);
|
|
impl_table_header!(Meme, vec!["Link", "Category", "User", "Timestamp"]);
|
|
|
|
/// a newtype wrapper to convert libjens types to table rows
|
|
pub struct JMTableEntry<T>(pub T);
|
|
|
|
impl From<JMTableEntry<User>> for Row {
|
|
fn from(e: JMTableEntry<User>) -> Self {
|
|
vec![e.0.name, e.0.id.unwrap_or_else(String::new)].into()
|
|
}
|
|
}
|
|
|
|
impl From<JMTableEntry<Category>> for Row {
|
|
fn from(e: JMTableEntry<Category>) -> Self {
|
|
vec![e.0.name, e.0.id].into()
|
|
}
|
|
}
|
|
|
|
impl From<JMTableEntry<Meme>> for Row {
|
|
fn from(e: JMTableEntry<Meme>) -> Self {
|
|
vec![
|
|
e.0.link,
|
|
e.0.category,
|
|
e.0.user,
|
|
Local
|
|
.timestamp(e.0.timestamp, 0)
|
|
.format("%F %R")
|
|
.to_string(),
|
|
]
|
|
.into()
|
|
}
|
|
}
|
|
|
|
pub trait TableExt {
|
|
fn add_rows<T: Into<Row>>(&mut self, iter: impl IntoIterator<Item = T>) -> &mut Self;
|
|
|
|
fn type_header<T: TableHeader>(&mut self) -> &mut Self;
|
|
}
|
|
|
|
impl TableExt for Table {
|
|
fn add_rows<T: Into<Row>>(&mut self, iter: impl IntoIterator<Item = T>) -> &mut Self {
|
|
for i in iter.into_iter() {
|
|
self.add_row(i);
|
|
}
|
|
self
|
|
}
|
|
|
|
fn type_header<T: TableHeader>(&mut self) -> &mut Self {
|
|
self.set_header(T::header())
|
|
}
|
|
}
|