-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrangeConverter.go
75 lines (61 loc) · 1.82 KB
/
rangeConverter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package main
import (
"regexp"
"strconv"
"github.com/joomcode/errorx"
)
const (
numberRegexpString = "^\\d+$"
rangeRegexpString = "^(-?\\d+):(-?\\d+)$"
)
var (
ErrRangeNamespace = errorx.NewNamespace("range")
ErrInvalidRegexp = errorx.NewType(ErrRangeNamespace, "InvalidRegexp")
ErrInvalidRange = errorx.NewType(ErrRangeNamespace, "InvalidRange")
)
type RangeConverter struct {
}
func NewRangeConverter() *RangeConverter {
return &RangeConverter{}
}
func (p *RangeConverter) RangeToInt(stringRanges []string) ([]int, error) {
var result []int
numberRegexp, err := regexp.Compile(numberRegexpString)
if err != nil {
return nil, ErrInvalidRegexp.Wrap(err, numberRegexpString)
}
rangeRegexp, err := regexp.Compile(rangeRegexpString)
if err != nil {
return nil, ErrInvalidRegexp.Wrap(err, rangeRegexpString)
}
for _, stringValue := range stringRanges {
if numberRegexp.MatchString(stringValue) {
intValue, err := strconv.Atoi(stringValue)
if err != nil {
return nil, ErrInvalidRange.Wrap(err, stringValue)
}
result = append(result, intValue)
} else if rangeRegexp.MatchString(stringValue) {
submatch := rangeRegexp.FindStringSubmatch(stringValue)
minValue, err := strconv.Atoi(submatch[1])
if err != nil {
return nil, ErrInvalidRange.Wrap(err, "%v %v", stringValue, submatch[1])
}
maxValue, err := strconv.Atoi(submatch[2])
if err != nil {
return nil, ErrInvalidRange.Wrap(err, "%v %v", stringValue, submatch[2])
}
if minValue > maxValue {
return nil, ErrInvalidRange.New(
"Minimum value should be less than maximum: %v", stringValue,
)
}
for i := minValue; i <= maxValue; i++ {
result = append(result, i)
}
} else {
return nil, ErrInvalidRange.New("Provided: '%v'. Correct value looks like '1:99'", stringValue)
}
}
return result, nil
}