-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcli.go
65 lines (57 loc) · 1.19 KB
/
cli.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
54
55
56
57
58
59
60
61
62
63
64
65
package httpdate
import (
"flag"
"fmt"
"io"
"os"
"regexp"
"time"
)
const (
exitcodeOK = iota
exitCodeParseFlagErr
exitCodeErr
)
// Run the cli
func Run(argv []string) int {
return (&cli{os.Stdout, os.Stderr}).run(argv)
}
type cli struct {
outStream, errStream io.Writer
}
var numOnlyReg = regexp.MustCompile(`^\d+$`)
func (cl *cli) run(argv []string) int {
fs := flag.NewFlagSet("httpdate", flag.ContinueOnError)
fs.SetOutput(cl.errStream)
fs.Usage = func() {
fmt.Fprintf(cl.errStream, "Usage of httpdate version %s (rev: %s):\n", Version, revision)
fs.PrintDefaults()
}
var str2time = fs.Bool("s", false, "force str2time")
if err := fs.Parse(argv); err != nil {
if err == flag.ErrHelp {
return exitcodeOK
}
return exitCodeParseFlagErr
}
if fs.NArg() != 1 {
fs.Usage()
return exitCodeParseFlagErr
}
arg := fs.Args()[0]
if !*str2time && !numOnlyReg.MatchString(arg) {
*str2time = true
}
if *str2time {
t, err := Str2Time(arg, nil)
if err != nil {
fmt.Fprintln(cl.errStream, err)
return exitCodeErr
}
fmt.Fprintf(cl.outStream, "%d\n", t.Unix())
} else {
s := Time2Str(time.Unix(int64(a2i(arg)), 0))
fmt.Fprintln(cl.outStream, s)
}
return exitcodeOK
}