99 lines
1.9 KiB
Go
99 lines
1.9 KiB
Go
package versions
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
type setBound struct {
|
|
v Version
|
|
op setBoundOp
|
|
}
|
|
|
|
func (s setBound) Has(v Version) bool {
|
|
switch s.op {
|
|
case setBoundGT:
|
|
return v.GreaterThan(s.v)
|
|
case setBoundGTE:
|
|
return v.GreaterThan(s.v) || v.Same(s.v)
|
|
case setBoundLT:
|
|
return v.LessThan(s.v)
|
|
case setBoundLTE:
|
|
return v.LessThan(s.v) || v.Same(s.v)
|
|
default:
|
|
// Should never happen because the above is exhaustive
|
|
panic("invalid setBound operator")
|
|
}
|
|
}
|
|
|
|
func (s setBound) AllRequested() Set {
|
|
// Inequalities request nothing.
|
|
return None
|
|
}
|
|
|
|
func (s setBound) GoString() string {
|
|
switch s.op {
|
|
case setBoundGT:
|
|
return fmt.Sprintf("versions.NewerThan(%#v)", s.v)
|
|
case setBoundGTE:
|
|
return fmt.Sprintf("versions.AtLeast(%#v)", s.v)
|
|
case setBoundLT:
|
|
return fmt.Sprintf("versions.OlderThan(%#v)", s.v)
|
|
case setBoundLTE:
|
|
return fmt.Sprintf("versions.AtMost(%#v)", s.v)
|
|
default:
|
|
// Should never happen because the above is exhaustive
|
|
return fmt.Sprintf("versions.Set{versions.setBound{v:%#v,op:%#v}}", s.v, s.op)
|
|
}
|
|
}
|
|
|
|
// NewerThan returns a set containing all versions greater than the given
|
|
// version, non-inclusive.
|
|
func NewerThan(v Version) Set {
|
|
return Set{
|
|
setI: setBound{
|
|
v: v,
|
|
op: setBoundGT,
|
|
},
|
|
}
|
|
}
|
|
|
|
// OlderThan returns a set containing all versions lower than the given
|
|
// version, non-inclusive.
|
|
func OlderThan(v Version) Set {
|
|
return Set{
|
|
setI: setBound{
|
|
v: v,
|
|
op: setBoundLT,
|
|
},
|
|
}
|
|
}
|
|
|
|
// AtLeast returns a set containing all versions greater than or equal to
|
|
// the given version.
|
|
func AtLeast(v Version) Set {
|
|
return Set{
|
|
setI: setBound{
|
|
v: v,
|
|
op: setBoundGTE,
|
|
},
|
|
}
|
|
}
|
|
|
|
// AtMost returns a set containing all versions less than or equal to the given
|
|
// version, non-inclusive.
|
|
func AtMost(v Version) Set {
|
|
return Set{
|
|
setI: setBound{
|
|
v: v,
|
|
op: setBoundLTE,
|
|
},
|
|
}
|
|
}
|
|
|
|
type setBoundOp rune
|
|
|
|
const setBoundGT = '>'
|
|
const setBoundGTE = '≥'
|
|
const setBoundLT = '<'
|
|
const setBoundLTE = '≤'
|