use colored::Colorize;
use std::fmt::Display;
#[derive(Clone, Copy)]
pub enum TextStyle {
Normal,
Bold,
Italic,
Underline,
}
pub struct TextBlock {
content: String,
color: Option<String>,
style: TextStyle,
}
impl TextBlock {
pub fn new(content: impl Into<String>) -> Self {
Self {
content: content.into(),
color: None,
style: TextStyle::Normal,
}
}
pub fn color(mut self, color: impl Into<String>) -> Self {
self.color = Some(color.into());
self
}
pub fn style(mut self, style: TextStyle) -> Self {
self.style = style;
self
}
pub fn build(&self) -> String {
let mut text = self.content.clone();
if let Some(color) = &self.color {
text = match color.as_str() {
"black" => text.black().to_string(),
"red" => text.red().to_string(),
"green" => text.green().to_string(),
"yellow" => text.yellow().to_string(),
"blue" => text.blue().to_string(),
"magenta" => text.magenta().to_string(),
"cyan" => text.cyan().to_string(),
"white" => text.white().to_string(),
"bright_black" => text.bright_black().to_string(),
"bright_red" => text.bright_red().to_string(),
"bright_green" => text.bright_green().to_string(),
"bright_yellow" => text.bright_yellow().to_string(),
"bright_blue" => text.bright_blue().to_string(),
"bright_magenta" => text.bright_magenta().to_string(),
"bright_cyan" => text.bright_cyan().to_string(),
"bright_white" => text.bright_white().to_string(),
"dimmed" => text.dimmed().to_string(),
_ => text,
};
}
match self.style {
TextStyle::Normal => text,
TextStyle::Bold => text.bold().to_string(),
TextStyle::Italic => text.italic().to_string(),
TextStyle::Underline => text.underline().to_string(),
}
}
}
impl Display for TextBlock {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.build())
}
}
pub fn format_size(size: u64) -> String {
const KB: u64 = 1024;
const MB: u64 = KB * 1024;
const GB: u64 = MB * 1024;
const TB: u64 = GB * 1024;
if size >= TB {
format!("{:.2} TB", size as f64 / TB as f64)
} else if size >= GB {
format!("{:.2} GB", size as f64 / GB as f64)
} else if size >= MB {
format!("{:.2} MB", size as f64 / MB as f64)
} else if size >= KB {
format!("{:.2} KB", size as f64 / KB as f64)
} else {
format!("{} B", size)
}
}