Skip to content

Commit 7efca59

Browse files
authored
Rename Constraints to Constraint and make it a struct instead of a slice (#29)
Signed-off-by: Kimmo Lehto <[email protected]>
1 parent b7530de commit 7efca59

File tree

2 files changed

+39
-51
lines changed

2 files changed

+39
-51
lines changed

constraint.go

Lines changed: 38 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -7,39 +7,37 @@ import (
77
"strings"
88
)
99

10-
var constraintRegex = regexp.MustCompile(`^(?:(>=|>|<=|<|!=|==?)\s*)?(.+)$`)
10+
var constraintRegex = regexp.MustCompile(`^\s*(?:(>=|>|<=|<|!=|==?)\s*)?(.+)\s*$`)
1111

12-
type constraintFunc func(a, b *Version) bool
13-
type constraint struct {
14-
f constraintFunc
15-
b *Version
16-
original string
17-
}
18-
19-
// Constraints is a collection of version constraint rules that can be checked against a version.
20-
type Constraints []constraint
12+
type (
13+
constraintFunc func(a, b *Version) bool
14+
constraintSegment struct {
15+
f constraintFunc
16+
b *Version
17+
}
18+
Constraint struct {
19+
segments []constraintSegment
20+
original string
21+
}
22+
)
2123

22-
// NewConstraint parses a string into a Constraints object that can be used to check
23-
// if a given version satisfies the constraint.
24-
func NewConstraint(cs string) (Constraints, error) {
24+
// NewConstraint parses a string and returns a Contraint and an error if the parsing fails.
25+
func NewConstraint(cs string) (Constraint, error) {
26+
c := Constraint{original: cs}
2527
parts := strings.Split(cs, ",")
26-
newC := make(Constraints, len(parts))
27-
for i, p := range parts {
28-
parts[i] = strings.TrimSpace(p)
29-
}
30-
for i, p := range parts {
31-
c, err := newConstraint(p)
28+
for _, p := range parts {
29+
segments, err := parseSegment(p)
3230
if err != nil {
33-
return Constraints{}, err
31+
return c, err
3432
}
35-
newC[i] = c
33+
c.segments = append(c.segments, segments...)
3634
}
3735

38-
return newC, nil
36+
return c, nil
3937
}
4038

4139
// MustConstraint is like NewConstraint but panics if the constraint is invalid.
42-
func MustConstraint(cs string) Constraints {
40+
func MustConstraint(cs string) Constraint {
4341
c, err := NewConstraint(cs)
4442
if err != nil {
4543
panic("github.com/k0sproject/version: NewConstraint: " + err.Error())
@@ -48,17 +46,13 @@ func MustConstraint(cs string) Constraints {
4846
}
4947

5048
// String returns the constraint as a string.
51-
func (cs Constraints) String() string {
52-
s := make([]string, len(cs))
53-
for i, c := range cs {
54-
s[i] = c.String()
55-
}
56-
return strings.Join(s, ", ")
49+
func (cs Constraint) String() string {
50+
return cs.original
5751
}
5852

5953
// Check returns true if the given version satisfies all of the constraints.
60-
func (cs Constraints) Check(v *Version) bool {
61-
for _, c := range cs {
54+
func (cs Constraint) Check(v *Version) bool {
55+
for _, c := range cs.segments {
6256
if c.b.Prerelease() == "" && v.Prerelease() != "" {
6357
return false
6458
}
@@ -72,61 +66,56 @@ func (cs Constraints) Check(v *Version) bool {
7266

7367
// CheckString is like Check but takes a string version. If the version is invalid,
7468
// it returns false.
75-
func (cs Constraints) CheckString(v string) bool {
69+
func (cs Constraint) CheckString(v string) bool {
7670
vv, err := NewVersion(v)
7771
if err != nil {
7872
return false
7973
}
8074
return cs.Check(vv)
8175
}
8276

83-
// String returns the original constraint string.
84-
func (c *constraint) String() string {
85-
return c.original
86-
}
87-
88-
func newConstraint(s string) (constraint, error) {
77+
func parseSegment(s string) ([]constraintSegment, error) {
8978
match := constraintRegex.FindStringSubmatch(s)
9079
if len(match) != 3 {
91-
return constraint{}, errors.New("invalid constraint: " + s)
80+
return nil, errors.New("invalid constraint: " + s)
9281
}
9382

9483
op := match[1]
9584
f, err := opfunc(op)
9685
if err != nil {
97-
return constraint{}, err
86+
return nil, err
9887
}
9988

10089
// convert one or two digit constraints to threes digit unless it's an equality operation
10190
if op != "" && op != "=" && op != "==" {
102-
segments := strings.Split(match[2], ".")
103-
if len(segments) < 3 {
104-
lastSegment := segments[len(segments)-1]
91+
vSegments := strings.Split(match[2], ".")
92+
if len(vSegments) < 3 {
93+
lastSegment := vSegments[len(vSegments)-1]
10594
var pre string
10695
if strings.Contains(lastSegment, "-") {
10796
parts := strings.Split(lastSegment, "-")
108-
segments[len(segments)-1] = parts[0]
97+
vSegments[len(vSegments)-1] = parts[0]
10998
pre = "-" + parts[1]
11099
}
111-
switch len(segments) {
100+
switch len(vSegments) {
112101
case 1:
113102
// >= 1 becomes >= 1.0.0
114103
// >= 1-rc.1 becomes >= 1.0.0-rc.1
115-
return newConstraint(fmt.Sprintf("%s %s.0.0%s", op, segments[0], pre))
104+
return parseSegment(fmt.Sprintf("%s %s.0.0%s", op, vSegments[0], pre))
116105
case 2:
117106
// >= 1.1 becomes >= 1.1.0
118107
// >= 1.1-rc.1 becomes >= 1.1.0-rc.1
119-
return newConstraint(fmt.Sprintf("%s %s.%s.0%s", op, segments[0], segments[1], pre))
108+
return parseSegment(fmt.Sprintf("%s %s.%s.0%s", op, vSegments[0], vSegments[1], pre))
120109
}
121110
}
122111
}
123112

124113
target, err := NewVersion(match[2])
125114
if err != nil {
126-
return constraint{}, err
115+
return nil, err
127116
}
128117

129-
return constraint{f: f, b: target, original: s}, nil
118+
return []constraintSegment{{f: f, b: target}}, nil
130119
}
131120

132121
func opfunc(s string) (constraintFunc, error) {
@@ -154,4 +143,3 @@ func gte(a, b *Version) bool { return b.GreaterThanOrEqual(a) }
154143
func lte(a, b *Version) bool { return b.LessThanOrEqual(a) }
155144
func eq(a, b *Version) bool { return b.Equal(a) }
156145
func neq(a, b *Version) bool { return !b.Equal(a) }
157-

version.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ func (v *Version) IsZero() bool {
409409
}
410410

411411
// Satisfies returns true if the version satisfies the supplied constraint
412-
func (v *Version) Satisfies(constraint Constraints) bool {
412+
func (v *Version) Satisfies(constraint Constraint) bool {
413413
return constraint.Check(v)
414414
}
415415

0 commit comments

Comments
 (0)