use string_width::DisplayWidth;
fn main() {
println!("=== Terminal Formatting Examples ===\n");
let texts = vec!["Hello", "δ½ ε₯½", "π World", "CafΓ©", "πΊπΈ USA", "π¨βπ©βπ§βπ¦ Family"];
println!("Left-aligned (width 20):");
for text in &texts {
let width = text.display_width();
let padding = 20_i32.saturating_sub(width as i32).max(0) as usize;
println!("β{}{}β", text, " ".repeat(padding));
}
println!("\nRight-aligned (width 20):");
for text in &texts {
let width = text.display_width();
let padding = 20_i32.saturating_sub(width as i32).max(0) as usize;
println!("β{}{}β", " ".repeat(padding), text);
}
println!("\nCenter-aligned (width 20):");
for text in &texts {
let width = text.display_width();
let total_padding = 20_i32.saturating_sub(width as i32).max(0) as usize;
let left_padding = total_padding / 2;
let right_padding = total_padding - left_padding;
println!(
"β{}{}{}β",
" ".repeat(left_padding),
text,
" ".repeat(right_padding)
);
}
println!("\n=== Table Example ===");
let data = vec![
("Name", "Country", "Greeting"),
("Alice", "πΊπΈ USA", "Hello!"),
("η°δΈ", "π―π΅ Japan", "γγγ«γ‘γ―"),
("JosΓ©", "πͺπΈ Spain", "Β‘Hola!"),
("Ahmed", "πͺπ¬ Egypt", "Ω
Ψ±ΨΨ¨Ψ§"),
];
let col_widths = (0..3)
.map(|col| {
data.iter()
.map(|row| match col {
0 => row.0.display_width(),
1 => row.1.display_width(),
2 => row.2.display_width(),
_ => 0,
})
.max()
.unwrap_or(0)
})
.collect::<Vec<_>>();
for (i, (name, country, greeting)) in data.iter().enumerate() {
if i == 0 {
println!(
"β{}β¬{}β¬{}β",
"β".repeat(col_widths[0] + 2),
"β".repeat(col_widths[1] + 2),
"β".repeat(col_widths[2] + 2)
);
}
let name_padding = col_widths[0].saturating_sub(name.display_width());
let country_padding = col_widths[1].saturating_sub(country.display_width());
let greeting_padding = col_widths[2].saturating_sub(greeting.display_width());
println!(
"β {}{} β {}{} β {}{} β",
name,
" ".repeat(name_padding),
country,
" ".repeat(country_padding),
greeting,
" ".repeat(greeting_padding)
);
if i == 0 {
println!(
"β{}βΌ{}βΌ{}β€",
"β".repeat(col_widths[0] + 2),
"β".repeat(col_widths[1] + 2),
"β".repeat(col_widths[2] + 2)
);
}
}
println!(
"β{}β΄{}β΄{}β",
"β".repeat(col_widths[0] + 2),
"β".repeat(col_widths[1] + 2),
"β".repeat(col_widths[2] + 2)
);
println!("\n=== Progress Bar Example ===");
let tasks = vec![
("Downloading files", "π₯", 100),
("Processing data", "βοΈ", 75),
("Uploading results", "π€", 45),
("Sending notifications", "π§", 0),
];
for (task, emoji, progress) in tasks {
let bar_width = 30;
let filled = (progress * bar_width) / 100;
let empty = bar_width - filled;
let task_display = format!("{} {}", emoji, task);
let task_width = task_display.display_width();
let task_padding = 25_i32.saturating_sub(task_width as i32).max(0) as usize;
println!(
"{}{} [{}{}] {:3}%",
task_display,
" ".repeat(task_padding),
"β".repeat(filled),
"β".repeat(empty),
progress
);
}
}