// SPDX-License-Identifier: MIT // Copyright (c) 2025 . All rights reserved. //! Minimal UI helpers used across the core crate. //! This keeps interactive bits centralized and easy to stub in tests. /// Progress indicators and reporting tools for displaying task completion. pub mod progress; use std::io::{self, Write}; /// Print an informational line to stderr (suppressed when quiet mode is enabled by callers). pub fn info(msg: impl AsRef) { eprintln!("{}", msg.as_ref()); } /// Print a warning line to stderr. pub fn warn(msg: impl AsRef) { eprintln!("WARNING: {}", msg.as_ref()); } /// Print an error line to stderr. pub fn error(msg: impl AsRef) { eprintln!("ERROR: {}", msg.as_ref()); } /// Print a short intro header (non-fancy). pub fn intro(title: impl AsRef) { eprintln!("== {} ==", title.as_ref()); } /// Print a short outro footer (non-fancy). pub fn outro(msg: impl AsRef) { eprintln!("{}", msg.as_ref()); } /// Print a line that should appear above any progress indicators (plain for now). pub fn println_above_bars(line: impl AsRef) { eprintln!("{}", line.as_ref()); } /// Prompt for input on stdin. Returns default if provided and user enters empty string. /// In non-interactive workflows, callers should skip prompt based on their flags. pub fn prompt_input(prompt: &str, default: Option<&str>) -> io::Result { let mut stdout = io::stdout(); match default { Some(def) => { write!(stdout, "{} [{}]: ", prompt, def)?; } None => { write!(stdout, "{}: ", prompt)?; } } stdout.flush()?; let mut buf = String::new(); io::stdin().read_line(&mut buf)?; let trimmed = buf.trim(); if trimmed.is_empty() { Ok(default.unwrap_or_default().to_string()) } else { Ok(trimmed.to_string()) } }