mirror of
https://github.com/neilotoole/sq.git
synced 2024-12-21 15:11:39 +03:00
69 lines
1.3 KiB
Go
69 lines
1.3 KiB
Go
|
package cli
|
||
|
|
||
|
import (
|
||
|
"io"
|
||
|
"os"
|
||
|
|
||
|
"golang.org/x/sys/windows"
|
||
|
"golang.org/x/term"
|
||
|
)
|
||
|
|
||
|
// isTerminal returns true if w is a terminal.
|
||
|
func isTerminal(w io.Writer) bool {
|
||
|
switch v := w.(type) {
|
||
|
case *os.File:
|
||
|
return term.IsTerminal(int(v.Fd()))
|
||
|
default:
|
||
|
return false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// isColorTerminal returns true if w is a colorable terminal.
|
||
|
// It respects [NO_COLOR], [FORCE_COLOR] and TERM=dumb environment variables.
|
||
|
//
|
||
|
// Acknowledgement: This function is lifted from neilotoole/jsoncolor, but
|
||
|
// it was contributed by @hermannm.
|
||
|
// - https://github.com/neilotoole/jsoncolor/pull/27
|
||
|
//
|
||
|
// [NO_COLOR]: https://no-color.org/
|
||
|
// [FORCE_COLOR]: https://force-color.org/
|
||
|
func isColorTerminal(w io.Writer) bool {
|
||
|
if os.Getenv("NO_COLOR") != "" {
|
||
|
return false
|
||
|
}
|
||
|
if os.Getenv("FORCE_COLOR") != "" {
|
||
|
return true
|
||
|
}
|
||
|
if os.Getenv("TERM") == "dumb" {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
if w == nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
f, ok := w.(*os.File)
|
||
|
if !ok {
|
||
|
return false
|
||
|
}
|
||
|
fd := f.Fd()
|
||
|
|
||
|
console := windows.Handle(fd)
|
||
|
var mode uint32
|
||
|
if err := windows.GetConsoleMode(console, &mode); err != nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
var want uint32 = windows.ENABLE_PROCESSED_OUTPUT | windows.ENABLE_VIRTUAL_TERMINAL_PROCESSING
|
||
|
if (mode & want) == want {
|
||
|
return true
|
||
|
}
|
||
|
|
||
|
mode |= want
|
||
|
if err := windows.SetConsoleMode(console, mode); err != nil {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
return true
|
||
|
}
|