-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathrange.go
75 lines (64 loc) · 1.4 KB
/
range.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 semver
import (
"fmt"
)
// Range represents a min to max version range.
// Min and Max are inclusive >=/<=
// e.g. 1.0.0 - 1.1.0 would contain both 1.0.0 and 1.1.0.
type Range struct {
Min Version
Max Version
}
func (r *Range) String() string {
if r.Min.Same(r.Max) {
return r.Min.String()
}
return fmt.Sprintf("%s - %s", r.Min.String(), r.Max.String())
}
// Check if the given version is contained in the range.
func (r *Range) Check(v Version) bool {
if v.LessThan(r.Min) {
return false
}
if v.GreaterThan(r.Max) {
return false
}
return true
}
// Checks if the given constraint fits into this range.
func (r *Range) Contains(other Constraint) bool {
return rangeContains(*r, other)
}
// reverse contains comparison to compare a range against another constraint.
func rangeContains(r Range, other Constraint) bool {
switch v := other.(type) {
case *Range:
return rangeContainsRange(r, *v)
case *originalInputConstraint:
return rangeContains(r, v.Constraint)
case not:
return !rangeContainsRange(r, v.Range)
case and:
for _, ac := range v {
if !rangeContains(r, ac) {
return false
}
}
return true
case or:
for _, ac := range v {
if rangeContains(r, ac) {
return true
}
}
return false
}
return false
}
func rangeContainsRange(rA, rB Range) bool {
if rA.Min.Compare(rB.Min) <= 0 &&
rA.Max.Compare(rB.Max) >= 0 {
return true
}
return false
}