package cli import ( "fmt" "os" "strings" "time" ) type FlagStringArray []string func (array *FlagStringArray) String() string { return strings.Join(*array, ", ") } func (array *FlagStringArray) Set(s string) error { *array = append(*array, s) return nil } type FileList FlagStringArray func (fileList FileList) Strings() []string { return ([]string)(fileList) } func (fileList *FileList) String() string { return (*FlagStringArray)(fileList).String() } func (fileList *FileList) Set(s string) error { if _, err := os.Stat(s); os.IsNotExist(err) { return fmt.Errorf("file does not exist: %s", s) } return (*FlagStringArray)(fileList).Set(s) } type Period struct { Start time.Time Stop time.Time } func (period Period) Empty() bool { return period.Stop.Sub(period.Start) == 0 } func (period *Period) String() string { return fmt.Sprintf("%s..%s", period.Start, period.Stop) } func (period *Period) Set(s string) error { if result, err := time.Parse("2006", s); err == nil { period.Start = result period.Stop = result.AddDate(1, 0, 0).Add(-1 * time.Minute) return nil } if result, err := time.Parse("2006-01", s); err == nil { period.Start = result period.Stop = result.AddDate(0, 1, 0).Add(-1 * time.Minute) return nil } if result, err := time.Parse("2006-01-02", s); err == nil { period.Start = result period.Stop = result.AddDate(0, 0, 1).Add(-1 * time.Minute) return nil } return fmt.Errorf("unimplemented format: %s", s) }