use owo_colors::OwoColorize;
pub fn header(text: &str) {
println!();
println!("{}", text.bold().cyan());
println!("{}", "─".repeat(text.len()).dimmed());
println!();
}
pub fn logo() {
let logo = r#"
██████╗ ██████╗ █████╗ ██╗ ██╗
██╔══██╗██╔══██╗██╔══██╗╚██╗██╔╝
██████╔╝██████╔╝███████║ ╚███╔╝
██╔═══╝ ██╔══██╗██╔══██║ ██╔██╗
██║ ██║ ██║██║ ██║██╔╝ ██╗
╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═╝
"#;
println!("{}", logo.bright_cyan().bold());
}
pub fn section(text: &str) {
println!("{}", text.bold().white());
}
pub fn kv(key: &str, value: &str) {
println!(" {}: {}", key.dimmed(), value);
}
pub fn success(text: &str) {
println!("{} {}", "✔".green().bold(), text.green());
}
pub fn info(text: &str) {
println!("{} {}", "ℹ".blue().bold(), text);
}
pub fn warn(text: &str) {
println!("{} {}", "⚠".yellow().bold(), text.yellow());
}
pub fn error(text: &str) {
eprintln!("{} {}", "✖".red().bold(), text.red());
}
pub fn step(current: usize, total: usize, text: &str) {
println!("{} {}", format!("[{}/{}]", current, total).dimmed(), text);
}
pub fn list(text: &str) {
println!("{}", text);
}
pub fn list_item(text: &str) {
println!(" {} {}", "•".dimmed(), text);
}
pub fn numbered_item(number: usize, text: &str) {
println!(" {}. {}", number.to_string().dimmed(), text);
}
pub fn newline() {
println!();
}
pub fn dim(text: &str) {
println!("{}", text.dimmed());
}
pub fn code(code: &str, _language: &str) {
println!();
for line in code.lines() {
println!(" {}", line.bright_white());
}
println!();
}
pub fn style_success(text: &str) -> String {
text.green().to_string()
}
pub fn style_pending(text: &str) -> String {
text.yellow().to_string()
}
pub fn style_error(text: &str) -> String {
text.red().to_string()
}
pub fn confirm(prompt: &str) -> bool {
use std::io::{self, Write};
print!("{} {} ", prompt, "[y/N]".dimmed());
io::stdout().flush().ok();
let mut input = String::new();
if io::stdin().read_line(&mut input).is_err() {
return false;
}
matches!(input.trim().to_lowercase().as_str(), "y" | "yes")
}
pub fn input(prompt: &str) -> Option<String> {
use std::io::{self, Write};
print!("{}: ", prompt);
io::stdout().flush().ok();
let mut input = String::new();
if io::stdin().read_line(&mut input).is_err() {
return None;
}
let trimmed = input.trim();
if trimmed.is_empty() {
None
} else {
Some(trimmed.to_string())
}
}
pub fn select(prompt: &str, options: &[&str]) -> Option<usize> {
use std::io::{self, Write};
println!("{}", prompt);
for (i, option) in options.iter().enumerate() {
println!(" {} {}", format!("{})", i + 1).dimmed(), option);
}
print!("{}: ", "Select".dimmed());
io::stdout().flush().ok();
let mut input = String::new();
if io::stdin().read_line(&mut input).is_err() {
return None;
}
input
.trim()
.parse::<usize>()
.ok()
.filter(|&n| n > 0 && n <= options.len())
.map(|n| n - 1)
}