garbage 0.4.3

CLI tool for interacting with the freedesktop trashcan
Documentation
use std::io::stdout;
use std::io::Write;
use std::ops::Deref;

use anyhow::Result;
use chrono_humanize::HumanTime;
use prettytable::{cell, format::consts::FORMAT_CLEAN, Row, Table};

use crate::TrashInfo;

pub fn print_files_list<I, F>(files: F, with_index: bool) -> Result<()>
where
  I: Deref<Target = TrashInfo>,
  F: Iterator<Item = I>,
{
  print_files_list_to(files, with_index, stdout())
}

pub fn print_files_list_to<I, F, W>(
  files: F,
  with_index: bool,
  mut writer: W,
) -> Result<()>
where
  I: Deref<Target = TrashInfo>,
  F: Iterator<Item = I>,
  W: Write,
{
  let mut table = Table::new();
  table.set_format(*FORMAT_CLEAN);

  for (i, info) in files.enumerate() {
    let mut row = Row::empty();

    if with_index {
      row.add_cell(cell!(format!("[{}]", i)));
    }

    row.add_cell(cell!(info.deletion_date));
    row.add_cell(cell!(HumanTime::from(info.deletion_date)));
    row.add_cell(cell!(info.path.to_string_lossy()));

    table.add_row(row);
  }

  table.print(&mut writer)?;
  Ok(())
}

pub fn print_files_list_json<I, F>(files: F) -> Result<()>
where
  I: Deref<Target = TrashInfo>,
  F: Iterator<Item = I>,
{
  print_files_list_json_to(files, stdout())
}

pub fn print_files_list_json_to<I, F, W>(files: F, writer: W) -> Result<()>
where
  I: Deref<Target = TrashInfo>,
  F: Iterator<Item = I>,
  W: Write,
{
  let files: Vec<_> = files.collect(); // keep `I`s alive
  let files: Vec<_> = files.iter().map(Deref::deref).collect();
  serde_json::to_writer(writer, &files)?;
  Ok(())
}