Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use itertools::Itertools;
- struct MyRow {
- name: String,
- value: i32,
- }
- struct Column<'call, R> {
- _name: String,
- value_fn: &'call Fn(&R) -> String,
- }
- pub trait RenderColumn<R> {
- fn name(&self) -> String;
- fn get_value(&self, row: &R) -> String;
- }
- impl<'call, R> RenderColumn<R> for Column<'call, R> {
- fn name(&self) -> String {
- self._name.clone()
- }
- fn get_value(&self, row: &R) -> String {
- let fun = self.value_fn;
- fun(row)
- }
- }
- pub trait AsTable<R> {
- fn as_table<C: RenderColumn<R>>(&self, columns: &[C]) -> String;
- }
- impl<T> AsTable<T> for Vec<T> {
- fn as_table<RowSpec>(&self, columns: &[RowSpec]) -> String
- where RowSpec: RenderColumn<T>
- {
- let headings = columns.iter().map(|c| c.name()).join(", ");
- let rows = self.iter().map(|row|
- columns.iter().map(|column| column.get_value(&row))
- .join(", ")
- );
- std::iter::once(headings).chain(rows).join("\n")
- }
- }
- fn main() {
- let data = vec![
- MyRow { name: "foo".to_owned(), value: 123 },
- MyRow { name: "bar".to_owned(), value: 465 },
- MyRow { name: "baz".to_owned(), value: 890 },
- ];
- let table = data.as_table(&vec![
- Column{ _name: "first".to_owned(), value_fn: &(|row: &MyRow| row.name.clone()) },
- Column{ _name: "second".to_owned(), value_fn: &(|row: &MyRow| format!("{}", row.value)) }
- ]);
- println!("{}", table);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement