use aws_sdk_athena::primitives::DateTime;
use byte_unit::Byte;
use std::time::Duration;
pub trait DisplayValue {
fn to_display_value(&self) -> String;
}
pub trait OptionDisplayValue<T> {
fn to_display_value_or_default(&self) -> String;
}
impl<T: DisplayValue> OptionDisplayValue<T> for Option<T> {
fn to_display_value_or_default(&self) -> String {
self.as_ref()
.map(|v| v.to_display_value())
.unwrap_or_else(|| "-".to_string())
}
}
impl DisplayValue for String {
fn to_display_value(&self) -> String {
self.clone()
}
}
impl DisplayValue for &str {
fn to_display_value(&self) -> String {
self.to_string()
}
}
impl DisplayValue for i64 {
fn to_display_value(&self) -> String {
self.to_string()
}
}
impl DisplayValue for DateTime {
fn to_display_value(&self) -> String {
self.to_string()
}
}
impl DisplayValue for &DateTime {
fn to_display_value(&self) -> String {
(*self).to_string()
}
}
impl DisplayValue for Duration {
fn to_display_value(&self) -> String {
humantime::format_duration(*self).to_string()
}
}
pub trait ByteDisplay {
fn format_bytes(&self) -> String;
}
impl ByteDisplay for i64 {
fn format_bytes(&self) -> String {
Byte::from_i64(*self)
.map(|b| {
b.get_appropriate_unit(byte_unit::UnitType::Decimal)
.to_string()
})
.unwrap_or_else(|| "-".to_string())
}
}
pub trait OptionByteDisplay {
fn format_bytes_or_default(&self) -> String;
}
impl<T: Into<i64> + Copy> OptionByteDisplay for Option<T> {
fn format_bytes_or_default(&self) -> String {
self.map(|b| b.into().format_bytes())
.unwrap_or_else(|| "-".to_string())
}
}
pub trait DurationFormat {
fn format_duration_ms(&self) -> String;
}
impl DurationFormat for i64 {
fn format_duration_ms(&self) -> String {
Duration::from_millis(*self as u64).to_display_value()
}
}
pub trait OptionDurationFormat {
fn format_duration_ms_or_default(&self) -> String;
}
impl<T: Into<i64> + Copy> OptionDurationFormat for Option<T> {
fn format_duration_ms_or_default(&self) -> String {
self.map(|ms| ms.into().format_duration_ms())
.unwrap_or_else(|| "-".to_string())
}
}