context7_cli/platform.rs
1//! Platform-specific initialization for console encoding and ANSI support.
2//!
3//! On Windows, configures UTF-8 code page (65001) and enables
4//! virtual terminal processing for ANSI escape sequences.
5//! On other platforms, this is a no-op.
6
7/// Initialises platform-specific console settings.
8///
9/// Must be called as the FIRST action in `main()`, before any I/O.
10pub fn inicializar_plataforma() {
11 #[cfg(windows)]
12 configurar_console_utf8();
13
14 #[cfg(windows)]
15 habilitar_ansi_windows();
16}
17
18#[cfg(windows)]
19fn configurar_console_utf8() {
20 use windows_sys::Win32::System::Console::{SetConsoleCP, SetConsoleOutputCP};
21 // SAFETY: funções Windows API idempotentes que apenas definem codepage do console.
22 // Sem concorrência neste ponto — chamadas únicas no início de main() antes de qualquer thread.
23 unsafe {
24 SetConsoleOutputCP(65001); // CP_UTF8
25 SetConsoleCP(65001);
26 }
27}
28
29#[cfg(windows)]
30fn habilitar_ansi_windows() {
31 use colored::control;
32 // colored v2 em Windows Terminal/PowerShell 7+ detecta ANSI automaticamente.
33 // Para cmd.exe legado sem VirtualTerminalProcessing: forçar via set_virtual_terminal.
34 // Se falhar (cmd.exe muito antigo), desabilitar cores para evitar escape sequences brutas.
35 if control::set_virtual_terminal(true).is_err() {
36 control::set_override(false);
37 }
38}
39
40#[cfg(test)]
41mod testes {
42 use super::*;
43
44 /// Verifica que `inicializar_plataforma` não faz panic em nenhuma plataforma.
45 ///
46 /// Em Linux e macOS a função é no-op; em Windows configura UTF-8 e ANSI.
47 /// O teste garante que a chamada é segura independente do sistema operacional.
48 #[test]
49 fn testa_inicializar_plataforma_nao_faz_panic() {
50 // Deve completar sem panic em Linux, macOS e Windows.
51 inicializar_plataforma();
52 }
53
54 /// Verifica que `inicializar_plataforma` é no-op seguro em plataformas não-Windows.
55 ///
56 /// Em Linux e macOS a função não executa nenhuma instrução — apenas retorna.
57 /// O teste confirma que múltiplas chamadas consecutivas são seguras (idempotente).
58 #[cfg(not(windows))]
59 #[test]
60 fn testa_inicializar_plataforma_e_noop_em_nao_windows() {
61 // Múltiplas chamadas devem ser idempotentes e não causar efeitos colaterais.
62 inicializar_plataforma();
63 inicializar_plataforma();
64 inicializar_plataforma();
65 }
66}