Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.44 KB | None | 0 0
  1. use itertools::Itertools;
  2.  
  3. struct MyRow {
  4. name: String,
  5. value: i32,
  6. }
  7.  
  8. struct Column<'call, R> {
  9. _name: String,
  10. value_fn: &'call Fn(&R) -> String,
  11. }
  12.  
  13.  
  14. pub trait RenderColumn<R> {
  15. fn name(&self) -> String;
  16. fn get_value(&self, row: &R) -> String;
  17. }
  18.  
  19. impl<'call, R> RenderColumn<R> for Column<'call, R> {
  20. fn name(&self) -> String {
  21. self._name.clone()
  22. }
  23.  
  24. fn get_value(&self, row: &R) -> String {
  25. let fun = self.value_fn;
  26. fun(row)
  27. }
  28. }
  29.  
  30. pub trait AsTable<R> {
  31. fn as_table<C: RenderColumn<R>>(&self, columns: &[C]) -> String;
  32. }
  33.  
  34. impl<T> AsTable<T> for Vec<T> {
  35. fn as_table<RowSpec>(&self, columns: &[RowSpec]) -> String
  36. where RowSpec: RenderColumn<T>
  37. {
  38. let headings = columns.iter().map(|c| c.name()).join(", ");
  39.  
  40. let rows = self.iter().map(|row|
  41. columns.iter().map(|column| column.get_value(&row))
  42. .join(", ")
  43. );
  44. std::iter::once(headings).chain(rows).join("\n")
  45. }
  46. }
  47.  
  48. fn main() {
  49.  
  50. let data = vec![
  51. MyRow { name: "foo".to_owned(), value: 123 },
  52. MyRow { name: "bar".to_owned(), value: 465 },
  53. MyRow { name: "baz".to_owned(), value: 890 },
  54. ];
  55.  
  56.  
  57. let table = data.as_table(&vec![
  58. Column{ _name: "first".to_owned(), value_fn: &(|row: &MyRow| row.name.clone()) },
  59. Column{ _name: "second".to_owned(), value_fn: &(|row: &MyRow| format!("{}", row.value)) }
  60. ]);
  61.  
  62. println!("{}", table);
  63.  
  64. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement