File: time.go

package info (click to toggle)
golang-github-spf13-pflag 1.0.10-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental, forky, sid
  • size: 612 kB
  • sloc: sh: 80; makefile: 2
file content (124 lines) | stat: -rw-r--r-- 4,002 bytes parent folder | download
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package pflag

import (
	"fmt"
	"strings"
	"time"
)

// TimeValue adapts time.Time for use as a flag.
type timeValue struct {
	*time.Time
	formats []string
}

func newTimeValue(val time.Time, p *time.Time, formats []string) *timeValue {
	*p = val
	return &timeValue{
		Time:    p,
		formats: formats,
	}
}

// Set time.Time value from string based on accepted formats.
func (d *timeValue) Set(s string) error {
	s = strings.TrimSpace(s)
	for _, f := range d.formats {
		v, err := time.Parse(f, s)
		if err != nil {
			continue
		}
		*d.Time = v
		return nil
	}

	formatsString := ""
	for i, f := range d.formats {
		if i > 0 {
			formatsString += ", "
		}
		formatsString += fmt.Sprintf("`%s`", f)
	}

	return fmt.Errorf("invalid time format `%s` must be one of: %s", s, formatsString)
}

// Type name for time.Time flags.
func (d *timeValue) Type() string {
	return "time"
}

func (d *timeValue) String() string {
	if d.Time.IsZero() {
		return ""
	} else {
		return d.Time.Format(time.RFC3339Nano)
	}
}

// GetTime return the time value of a flag with the given name
func (f *FlagSet) GetTime(name string) (time.Time, error) {
	flag := f.Lookup(name)
	if flag == nil {
		err := fmt.Errorf("flag accessed but not defined: %s", name)
		return time.Time{}, err
	}

	if flag.Value.Type() != "time" {
		err := fmt.Errorf("trying to get %s value of flag of type %s", "time", flag.Value.Type())
		return time.Time{}, err
	}

	val, ok := flag.Value.(*timeValue)
	if !ok {
		return time.Time{}, fmt.Errorf("value %s is not a time", flag.Value)
	}

	return *val.Time, nil
}

// TimeVar defines a time.Time flag with specified name, default value, and usage string.
// The argument p points to a time.Time variable in which to store the value of the flag.
func (f *FlagSet) TimeVar(p *time.Time, name string, value time.Time, formats []string, usage string) {
	f.TimeVarP(p, name, "", value, formats, usage)
}

// TimeVarP is like TimeVar, but accepts a shorthand letter that can be used after a single dash.
func (f *FlagSet) TimeVarP(p *time.Time, name, shorthand string, value time.Time, formats []string, usage string) {
	f.VarP(newTimeValue(value, p, formats), name, shorthand, usage)
}

// TimeVar defines a time.Time flag with specified name, default value, and usage string.
// The argument p points to a time.Time variable in which to store the value of the flag.
func TimeVar(p *time.Time, name string, value time.Time, formats []string, usage string) {
	CommandLine.TimeVarP(p, name, "", value, formats, usage)
}

// TimeVarP is like TimeVar, but accepts a shorthand letter that can be used after a single dash.
func TimeVarP(p *time.Time, name, shorthand string, value time.Time, formats []string, usage string) {
	CommandLine.VarP(newTimeValue(value, p, formats), name, shorthand, usage)
}

// Time defines a time.Time flag with specified name, default value, and usage string.
// The return value is the address of a time.Time variable that stores the value of the flag.
func (f *FlagSet) Time(name string, value time.Time, formats []string, usage string) *time.Time {
	return f.TimeP(name, "", value, formats, usage)
}

// TimeP is like Time, but accepts a shorthand letter that can be used after a single dash.
func (f *FlagSet) TimeP(name, shorthand string, value time.Time, formats []string, usage string) *time.Time {
	p := new(time.Time)
	f.TimeVarP(p, name, shorthand, value, formats, usage)
	return p
}

// Time defines a time.Time flag with specified name, default value, and usage string.
// The return value is the address of a time.Time variable that stores the value of the flag.
func Time(name string, value time.Time, formats []string, usage string) *time.Time {
	return CommandLine.TimeP(name, "", value, formats, usage)
}

// TimeP is like Time, but accepts a shorthand letter that can be used after a single dash.
func TimeP(name, shorthand string, value time.Time, formats []string, usage string) *time.Time {
	return CommandLine.TimeP(name, shorthand, value, formats, usage)
}