diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index dd83fe4..7cc41fe 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -36,4 +36,5 @@ windows = { version = "0.54", features = [ "Win32_System_Threading", "Win32_UI_WindowsAndMessaging", "Win32_UI_Shell", + "Win32_System_Console", ] } diff --git a/crates/client/src/main.rs b/crates/client/src/main.rs index b867fb3..d658854 100644 --- a/crates/client/src/main.rs +++ b/crates/client/src/main.rs @@ -43,6 +43,22 @@ fn is_admin() -> bool { unsafe { IsUserAnAdmin().as_bool() } } +#[cfg(windows)] +fn enable_ansi() { + use windows::Win32::System::Console::{ + GetConsoleMode, GetStdHandle, SetConsoleMode, + ENABLE_VIRTUAL_TERMINAL_PROCESSING, STD_OUTPUT_HANDLE, + }; + unsafe { + if let Ok(handle) = GetStdHandle(STD_OUTPUT_HANDLE) { + let mut mode = Default::default(); + if GetConsoleMode(handle, &mut mode).is_ok() { + let _ = SetConsoleMode(handle, mode | ENABLE_VIRTUAL_TERMINAL_PROCESSING); + } + } + } +} + macro_rules! log_status { ($($arg:tt)*) => { println!(" {} {}", "→".cyan().bold(), format!($($arg)*)); @@ -144,6 +160,10 @@ fn prompt_config() -> Config { #[tokio::main] async fn main() { + // Enable ANSI color codes on Windows (required when running as admin) + #[cfg(windows)] + enable_ansi(); + // Suppress tracing output by default if std::env::var("RUST_LOG").is_err() { unsafe { std::env::set_var("RUST_LOG", "off"); }