| 184 | } |
| 185 | |
| 186 | func parseField(value string, fieldType fieldType) (*cronFieldBits, error) { |
| 187 | if len(value) == 0 { |
| 188 | return nil, fmt.Errorf("value must not be empty") |
| 189 | } |
| 190 | |
| 191 | if fieldType.Field == cronFieldMonth { |
| 192 | value = replaceOrdinals(value, months) |
| 193 | } else if fieldType.Field == cronFieldDayOfWeek { |
| 194 | value = replaceOrdinals(value, days) |
| 195 | } |
| 196 | |
| 197 | cronFieldBits := newFieldBits(fieldType) |
| 198 | |
| 199 | fields := strings.Split(value, ",") |
| 200 | |
| 201 | for _, field := range fields { |
| 202 | slashPos := strings.Index(field, "/") |
| 203 | |
| 204 | step := -1 |
| 205 | var valueRange valueRange |
| 206 | |
| 207 | if slashPos != -1 { |
| 208 | rangeStr := field[0:slashPos] |
| 209 | |
| 210 | var err error |
| 211 | valueRange, err = parseRange(rangeStr, fieldType) |
| 212 | |
| 213 | if err != nil { |
| 214 | return nil, err |
| 215 | } |
| 216 | |
| 217 | if strings.Index(rangeStr, "-") == -1 { |
| 218 | valueRange = newValueRange(valueRange.MinValue, fieldType.MaxValue) |
| 219 | } |
| 220 | |
| 221 | stepStr := field[slashPos+1:] |
| 222 | |
| 223 | step, err = strconv.Atoi(stepStr) |
| 224 | |
| 225 | if err != nil { |
| 226 | return nil, fmt.Errorf("step must be number : \"%s\"", stepStr) |
| 227 | } |
| 228 | |
| 229 | if step <= 0 { |
| 230 | return nil, fmt.Errorf("step must be 1 or higher in \"%s\"", value) |
| 231 | } |
| 232 | |
| 233 | } else { |
| 234 | var err error |
| 235 | valueRange, err = parseRange(field, fieldType) |
| 236 | |
| 237 | if err != nil { |
| 238 | return nil, err |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | if step > 1 { |
| 243 | for index := valueRange.MinValue; index <= valueRange.MaxValue; index += step { |