1//go:build !windows
 2
 3package jsoncolor
 4
 5import (
 6	"io"
 7	"os"
 8
 9	"golang.org/x/term"
10)
11
12// IsColorTerminal returns true if w is a colorable terminal.
13// It respects [NO_COLOR], [FORCE_COLOR] and TERM=dumb environment variables.
14//
15// [NO_COLOR]: https://no-color.org/
16// [FORCE_COLOR]: https://force-color.org/
17func IsColorTerminal(w io.Writer) bool {
18	if os.Getenv("NO_COLOR") != "" {
19		return false
20	}
21	if os.Getenv("FORCE_COLOR") != "" {
22		return true
23	}
24	if os.Getenv("TERM") == "dumb" {
25		return false
26	}
27
28	if w == nil {
29		return false
30	}
31
32	f, ok := w.(*os.File)
33	if !ok {
34		return false
35	}
36
37	if !term.IsTerminal(int(f.Fd())) {
38		return false
39	}
40
41	return true
42}