-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathutil.go
53 lines (48 loc) · 1.1 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package conq
import (
"io/fs"
"log"
"os"
"github.com/Xuanwo/go-locale"
"golang.org/x/text/language"
"golang.org/x/text/message"
)
// only returns true when f has a `Stat()(fs.FileInfo,error)` method that designates
// it as a `os.ModeCharDevice`
func IsTerm(f interface{}) bool {
s, ok := f.(interface{ Stat() (fs.FileInfo, error) })
if !ok {
return false
}
st, err := s.Stat()
if err != nil {
return false
}
return st.Mode()&os.ModeCharDevice == os.ModeCharDevice
}
// A Ctx value that uses stdin,out,err, the os.Args and a locale-sensitive message.Printer
func OSContext(args ...string) Ctx {
if len(args) == 0 {
args = os.Args[1:]
}
return Ctx{
In: os.Stdin,
Out: os.Stdout,
Err: os.Stderr,
Args: args,
Printer: ctxPrinter(),
}
}
func ctxPrinter() *message.Printer {
tags, err := locale.DetectAll()
if err != nil {
log.Println("fallback english")
return message.NewPrinter(language.English)
}
names := make([]string, len(tags))
for i, t := range tags {
names[i] = t.String()
}
match := message.MatchLanguage(names...)
return message.NewPrinter(match)
}