Coverage Report

Created: 2025-11-16 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/anstyle-query-1.1.4/src/windows.rs
Line
Count
Source
1
//! Windows-specific style queries
2
3
#[cfg(windows)]
4
mod windows_console {
5
    use std::os::windows::io::AsRawHandle;
6
    use std::os::windows::io::RawHandle;
7
8
    use windows_sys::Win32::Foundation::HANDLE;
9
    use windows_sys::Win32::System::Console::CONSOLE_MODE;
10
    use windows_sys::Win32::System::Console::ENABLE_VIRTUAL_TERMINAL_PROCESSING;
11
12
    fn enable_vt(handle: RawHandle) -> std::io::Result<()> {
13
        unsafe {
14
            let handle: HANDLE = handle as HANDLE;
15
            if handle.is_null() {
16
                return Err(std::io::Error::new(
17
                    std::io::ErrorKind::BrokenPipe,
18
                    "console is detached",
19
                ));
20
            }
21
22
            let mut dwmode: CONSOLE_MODE = 0;
23
            if windows_sys::Win32::System::Console::GetConsoleMode(handle, &mut dwmode) == 0 {
24
                return Err(std::io::Error::last_os_error());
25
            }
26
27
            dwmode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
28
            if windows_sys::Win32::System::Console::SetConsoleMode(handle, dwmode) == 0 {
29
                return Err(std::io::Error::last_os_error());
30
            }
31
32
            Ok(())
33
        }
34
    }
35
36
    pub(crate) fn enable_virtual_terminal_processing() -> std::io::Result<()> {
37
        let stdout = std::io::stdout();
38
        let stdout_handle = stdout.as_raw_handle();
39
        let stderr = std::io::stderr();
40
        let stderr_handle = stderr.as_raw_handle();
41
42
        enable_vt(stdout_handle)?;
43
        if stdout_handle != stderr_handle {
44
            enable_vt(stderr_handle)?;
45
        }
46
47
        Ok(())
48
    }
49
50
    #[inline]
51
    pub(crate) fn enable_ansi_colors() -> Option<bool> {
52
        Some(
53
            enable_virtual_terminal_processing()
54
                .map(|_| true)
55
                .unwrap_or(false),
56
        )
57
    }
58
}
59
60
#[cfg(not(windows))]
61
mod windows_console {
62
    #[inline]
63
0
    pub(crate) fn enable_ansi_colors() -> Option<bool> {
64
0
        None
65
0
    }
66
}
67
68
/// Enable ANSI escape codes ([`ENABLE_VIRTUAL_TERMINAL_PROCESSING`](https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences#output-sequences))
69
///
70
/// For non-windows systems, returns `None`
71
0
pub fn enable_ansi_colors() -> Option<bool> {
72
0
    windows_console::enable_ansi_colors()
73
0
}
74
75
/// Raw `ENABLE_VIRTUAL_TERMINAL_PROCESSING` on stdout/stderr
76
#[cfg(windows)]
77
pub fn enable_virtual_terminal_processing() -> std::io::Result<()> {
78
    windows_console::enable_virtual_terminal_processing()
79
}