90 lines
3.1 KiB
Go
90 lines
3.1 KiB
Go
|
package versions
|
||
|
|
||
|
// Set is a set of versions, usually created by parsing a constraint string.
|
||
|
type Set struct {
|
||
|
setI
|
||
|
}
|
||
|
|
||
|
// setI is the private interface implemented by our various constraint
|
||
|
// operators.
|
||
|
type setI interface {
|
||
|
Has(v Version) bool
|
||
|
AllRequested() Set
|
||
|
GoString() string
|
||
|
}
|
||
|
|
||
|
// Has returns true if the given version is a member of the receiving set.
|
||
|
func (s Set) Has(v Version) bool {
|
||
|
// The special Unspecified version is excluded as soon as any sort of
|
||
|
// constraint is applied, and so the only set it is a member of is
|
||
|
// the special All set.
|
||
|
if v == Unspecified {
|
||
|
return s == All
|
||
|
}
|
||
|
|
||
|
return s.setI.Has(v)
|
||
|
}
|
||
|
|
||
|
// Requests returns true if the given version is specifically requested by
|
||
|
// the receiving set.
|
||
|
//
|
||
|
// Requesting is a stronger form of set membership that represents an explicit
|
||
|
// request for a particular version, as opposed to the version just happening
|
||
|
// to match some criteria.
|
||
|
//
|
||
|
// The functions Only and Selection mark their arguments as requested in
|
||
|
// their returned sets. Exact version constraints given in constraint strings
|
||
|
// also mark their versions as requested.
|
||
|
//
|
||
|
// The concept of requesting is intended to help deal with pre-release versions
|
||
|
// in a safe and convenient way. When given generic version constraints like
|
||
|
// ">= 1.0.0" the user generally does not intend to match a pre-release version
|
||
|
// like "2.0.0-beta1", but it is important to stil be able to use that
|
||
|
// version if explicitly requested using the constraint string "2.0.0-beta1".
|
||
|
func (s Set) Requests(v Version) bool {
|
||
|
return s.AllRequested().Has(v)
|
||
|
}
|
||
|
|
||
|
// AllRequested returns a subset of the receiver containing only the requested
|
||
|
// versions, as defined in the documentation for the method Requests.
|
||
|
//
|
||
|
// This can be used in conjunction with the predefined set "Released" to
|
||
|
// include pre-release versions only by explicit request, which is supported
|
||
|
// via the helper method WithoutUnrequestedPrereleases.
|
||
|
//
|
||
|
// The result of AllRequested is always a finite set.
|
||
|
func (s Set) AllRequested() Set {
|
||
|
return s.setI.AllRequested()
|
||
|
}
|
||
|
|
||
|
// WithoutUnrequestedPrereleases returns a new set that includes all released
|
||
|
// versions from the receiving set, plus any explicitly-requested pre-releases,
|
||
|
// but does not include any unrequested pre-releases.
|
||
|
//
|
||
|
// "Requested" here is as defined in the documentation for the "Requests" method.
|
||
|
//
|
||
|
// This method is equivalent to the following set operations:
|
||
|
//
|
||
|
// versions.Union(s.AllRequested(), s.Intersection(versions.Released))
|
||
|
func (s Set) WithoutUnrequestedPrereleases() Set {
|
||
|
return Union(s.AllRequested(), Released.Intersection(s))
|
||
|
}
|
||
|
|
||
|
// UnmarshalText is an implementation of encoding.TextUnmarshaler, allowing
|
||
|
// sets to be automatically unmarshalled from strings in text-based
|
||
|
// serialization formats, including encoding/json.
|
||
|
//
|
||
|
// The format expected is what is accepted by MeetingConstraintsString. Any
|
||
|
// parser errors are passed on verbatim to the caller.
|
||
|
func (s *Set) UnmarshalText(text []byte) error {
|
||
|
str := string(text)
|
||
|
new, err := MeetingConstraintsString(str)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
*s = new
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
var InitialDevelopment Set = OlderThan(MustParseVersion("1.0.0"))
|