jensmemesclient/cli/src/table.rs

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())
}
}