package cli import ( "errors" "fmt" "time" ) var ( errDateExclusive = errors.New("--date and --from/--to are mutually exclusive") errFromRequiresTo = errors.New("--from requires --to") errToRequiresFrom = errors.New("--to requires --from") errFromAfterTo = errors.New("is after --to") ) // ParseTargetDates turns the --date, --from and --to flags into the days // to extract. It returns nil when none of them is set, which bsdaily.Run // takes to mean the snapshot date minus one day. func ParseTargetDates(dateFlag, fromFlag, toFlag string) ([]time.Time, error) { hasDate := dateFlag != "" hasFrom := fromFlag != "" hasTo := toFlag != "" // Validate mutual exclusivity if hasDate && (hasFrom || hasTo) { return nil, errDateExclusive } if hasFrom != hasTo { if hasFrom { return nil, errFromRequiresTo } return nil, errToRequiresFrom } if hasDate { t, err := time.Parse("2006-01-02", dateFlag) if err != nil { return nil, fmt.Errorf( "invalid --date %q (expected YYYY-MM-DD): %w", dateFlag, err) } return []time.Time{t}, nil } if !hasFrom { return nil, nil } from, err := time.Parse("2006-01-02", fromFlag) if err != nil { return nil, fmt.Errorf( "invalid --from %q (expected YYYY-MM-DD): %w", fromFlag, err) } to, err := time.Parse("2006-01-02", toFlag) if err != nil { return nil, fmt.Errorf( "invalid --to %q (expected YYYY-MM-DD): %w", toFlag, err) } if from.After(to) { return nil, fmt.Errorf("--from %s %w %s", fromFlag, errFromAfterTo, toFlag) } var targetDates []time.Time for d := from; !d.After(to); d = d.AddDate(0, 0, 1) { targetDates = append(targetDates, d) } return targetDates, nil }