Defines modified syntax for version constraints.
The semver crate's
Version is fine. What's not fine is their
The reason we're rolling our own instead of using something like the semver crate is that the requirements for elba conflict with what semver provides. The vector-of-predicate approach which semver provides is too flexible, making it harder to validate versions and perform operations on them (check if one range is a subset of another, etc.). The semver crate also provides some unnecessary operations.
Instead, this module adds features in some places and removes others for flexibility where it matters for elba.
Versions in elba take lots of good ideas from Cargo and Pub (Dart) versioning. We follow
Cargo's compatibility rules for 0.* and 0.0.* versions to allow for less-stable packages.
Additionally, we also follow Cargo's rules when sigils are omitted.
However, we purposely elide star notation since it's unnecessary;
0.* == 0,
0.0.* == 0.0.
To make parsing easier,
<= must always precede
>=, like with Pub. Nonsensical
< 1 > 2 which are valid parses under semver get caught during parsing here.
In general, syntax is substantially stricter than in Cargo, and nonsensical constraints are
caught immediately when creating the constraint.
A set of
A continguous range in which a version can fall into. Syntax for ranges mirrors that of
Pub or Cargo. Ranges can accept caret and tilde syntax, as well as less-than/greater-than
specifications (just like Cargo). Like Pub, the
Represents a version number conforming to the semantic versioning scheme.