diff --git a/parser.go b/parser.go index 8da6547a..07c9e683 100644 --- a/parser.go +++ b/parser.go @@ -56,18 +56,17 @@ type Parser struct { // // Examples // -// // Standard parser without descriptors -// specParser := NewParser(Minute | Hour | Dom | Month | Dow) -// sched, err := specParser.Parse("0 0 15 */3 *") +// // Standard parser without descriptors +// specParser := NewParser(Minute | Hour | Dom | Month | Dow) +// sched, err := specParser.Parse("0 0 15 */3 *") // -// // Same as above, just excludes time fields -// specParser := NewParser(Dom | Month | Dow) -// sched, err := specParser.Parse("15 */3 *") -// -// // Same as above, just makes Dow optional -// specParser := NewParser(Dom | Month | DowOptional) -// sched, err := specParser.Parse("15 */3") +// // Same as above, just excludes time fields +// specParser := NewParser(Dom | Month | Dow) +// sched, err := specParser.Parse("15 */3 *") // +// // Same as above, just makes Dow optional +// specParser := NewParser(Dom | Month | DowOptional) +// sched, err := specParser.Parse("15 */3") func NewParser(options ParseOption) Parser { optionals := 0 if options&DowOptional > 0 { @@ -96,6 +95,9 @@ func (p Parser) Parse(spec string) (Schedule, error) { var err error i := strings.Index(spec, " ") eq := strings.Index(spec, "=") + if i == -1 { + return nil, fmt.Errorf("missing optional fields or descriptor after timezone: %s", spec) + } if loc, err = time.LoadLocation(spec[eq+1 : i]); err != nil { return nil, fmt.Errorf("provided bad location %s: %v", spec[eq+1:i], err) } @@ -247,7 +249,9 @@ func getField(field string, r bounds) (uint64, error) { } // getRange returns the bits indicated by the given expression: -// number | number "-" number [ "/" number ] +// +// number | number "-" number [ "/" number ] +// // or error parsing range. func getRange(expr string, r bounds) (uint64, error) { var ( diff --git a/parser_test.go b/parser_test.go index 41c8c520..860949cd 100644 --- a/parser_test.go +++ b/parser_test.go @@ -358,6 +358,28 @@ func TestNoDescriptorParser(t *testing.T) { } } +func TestMissingOptionalFieldsAndDescriptorAfterTimezone(t *testing.T) { + _, err := ParseStandard("TZ=UTC") + if err == nil { + t.Error("expected an error, got none") + } + + _, err = ParseStandard("TZ=UTC ") + if err == nil { + t.Error("expected an error, got none") + } + + _, err = ParseStandard("TZ=0") + if err == nil { + t.Error("expected an error, got none") + } + + _, err = ParseStandard("TZ=0 ") + if err == nil { + t.Error("expected an error, got none") + } +} + func every5min(loc *time.Location) *SpecSchedule { return &SpecSchedule{1 << 0, 1 << 5, all(hours), all(dom), all(months), all(dow), loc} }