use std::fmt;
use std::ops::Add;
use aws_sdk_s3::types::Object;
use humansize::*;
pub fn default_stats(summarize: bool) -> Option<FindStat> {
if summarize {
Some(FindStat::default())
} else {
None
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct FindStat {
pub total_files: usize,
pub total_space: i64,
pub max_size: Option<i64>,
pub min_size: Option<i64>,
pub max_key: String,
pub min_key: String,
pub average_size: i64,
}
impl fmt::Display for FindStat {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let file_size = make_format(BINARY);
let total_space = file_size(self.total_space as u64);
let max_size = file_size(self.max_size.unwrap_or_default() as u64);
let min_size = file_size(self.min_size.unwrap_or_default() as u64);
let average_size = file_size(self.average_size as u64);
writeln!(f)?;
writeln!(f, "Summary")?;
writeln!(f, "{:19} {}", "Total files:", &self.total_files)?;
writeln!(f, "Total space: {total_space}")?;
writeln!(f, "{:19} {}", "Largest file:", &self.max_key)?;
writeln!(f, "{:19} {}", "Largest file size:", max_size)?;
writeln!(f, "{:19} {}", "Smallest file:", &self.min_key)?;
writeln!(f, "{:19} {}", "Smallest file size:", min_size)?;
writeln!(f, "{:19} {}", "Average file size:", average_size)?;
Ok(())
}
}
impl Add<&[Object]> for FindStat {
type Output = FindStat;
#[allow(clippy::suspicious_arithmetic_impl)]
fn add(mut self: FindStat, list: &[Object]) -> Self {
for x in list {
self.total_files += 1;
let size = x.size;
self.total_space += size.unwrap_or_default();
match self.max_size {
None => {
self.max_size = size;
self.max_key = x.key.clone().unwrap_or_default();
}
Some(max_size) if max_size <= size.unwrap_or_default() => {
self.max_size = size;
self.max_key = x.key.clone().unwrap_or_default();
}
_ => {}
}
match self.min_size {
None => {
self.min_size = size;
self.min_key = x.key.clone().unwrap_or_default();
}
Some(min_size) if min_size > size.unwrap_or_default() => {
self.min_size = size;
self.min_key = x.key.clone().unwrap_or_default();
}
_ => {}
}
self.average_size = self.total_space / (self.total_files as i64);
}
self
}
}
impl Default for FindStat {
fn default() -> Self {
FindStat {
total_files: 0,
total_space: 0,
max_size: None,
min_size: None,
max_key: "".to_owned(),
min_key: "".to_owned(),
average_size: 0,
}
}
}