def parse_range(item, min, max)
return %w[ L ] if item == 'L'
item = '*' + item if item[0, 1] == '/'
m = item.match(RANGE_REGEX)
fail ArgumentError.new(
"cannot parse #{item.inspect}"
) unless m
mmin = min == -30 ? 1 : min
sta = m[1]
sta = sta == '*' ? mmin : sta.to_i
edn = m[2]
edn = edn ? edn.to_i : sta
edn = max if m[1] == '*'
inc = m[3]
inc = inc ? inc.to_i : 1
fail ArgumentError.new(
"#{item.inspect} positive/negative ranges not allowed"
) if (sta < 0 && edn > 0) || (sta > 0 && edn < 0)
fail ArgumentError.new(
"#{item.inspect} descending day ranges not allowed"
) if min == -30 && sta > edn
fail ArgumentError.new(
"#{item.inspect} is not in range #{min}..#{max}"
) if sta < min || edn > max
fail ArgumentError.new(
"#{item.inspect} increment must be greater than zero"
) if inc == 0
r = []
val = sta
loop do
v = val
v = 0 if max == 24 && v == 24
r << v
break if inc == 1 && val == edn
val += inc
break if inc > 1 && val > edn
val = min if val > max
end
r.uniq
end