pub struct Version {
pub major: u64,
pub minor: u64,
pub patch: u64,
pub pre: Prerelease,
pub build: BuildMetadata,
}
Expand description
SemVer version as defined by https://semver.org.
§Syntax
-
The major, minor, and patch numbers may be any integer 0 through u64::MAX. When representing a SemVer version as a string, each number is written as a base 10 integer. For example,
1.0.119
. -
Leading zeros are forbidden in those positions. For example
1.01.00
is invalid as a SemVer version. -
The pre-release identifier, if present, must conform to the syntax documented for
Prerelease
. -
The build metadata, if present, must conform to the syntax documented for
BuildMetadata
. -
Whitespace is not allowed anywhere in the version.
§Total ordering
Given any two SemVer versions, one is less than, greater than, or equal to the other. Versions may be compared against one another using Rust’s usual comparison operators.
-
The major, minor, and patch number are compared numerically from left to right, lexicographically ordered as a 3-tuple of integers. So for example version
1.5.0
is less than version1.19.0
, despite the fact that “1.19.0” < “1.5.0” as ASCIIbetically compared strings and 1.19 < 1.5 as real numbers. -
When major, minor, and patch are equal, a pre-release version is considered less than the ordinary release: version
1.0.0-alpha.1
is less than version1.0.0
. -
Two pre-releases of the same major, minor, patch are compared by lexicographic ordering of dot-separated components of the pre-release string.
-
Identifiers consisting of only digits are compared numerically:
1.0.0-pre.8
is less than1.0.0-pre.12
. -
Identifiers that contain a letter or hyphen are compared in ASCII sort order:
1.0.0-pre12
is less than1.0.0-pre8
. -
Any numeric identifier is always less than any non-numeric identifier:
1.0.0-pre.1
is less than1.0.0-pre.x
.
-
Example: 1.0.0-alpha
< 1.0.0-alpha.1
< 1.0.0-alpha.beta
< 1.0.0-beta
< 1.0.0-beta.2
< 1.0.0-beta.11
< 1.0.0-rc.1
< 1.0.0
Fields§
§major: u64
§minor: u64
§patch: u64
§pre: Prerelease
§build: BuildMetadata
Implementations§
Source§impl Version
impl Version
Sourcepub const fn new(major: u64, minor: u64, patch: u64) -> Self
pub const fn new(major: u64, minor: u64, patch: u64) -> Self
Create Version
with an empty pre-release and build metadata.
Equivalent to:
Version {
major,
minor,
patch,
pre: Prerelease::EMPTY,
build: BuildMetadata::EMPTY,
}
Sourcepub fn parse(text: &str) -> Result<Self, Error>
pub fn parse(text: &str) -> Result<Self, Error>
Create Version
by parsing from string representation.
§Errors
Possible reasons for the parse to fail include:
-
1.0
— too few numeric components. A SemVer version must have exactly three. If you are looking at something that has fewer than three numbers in it, it’s possible it is aVersionReq
instead (with an implicit default^
comparison operator). -
1.0.01
— a numeric component has a leading zero. -
1.0.unknown
— unexpected character in one of the components. -
1.0.0-
or1.0.0+
— the pre-release or build metadata are indicated present but empty. -
1.0.0-alpha_123
— pre-release or build metadata have something outside the allowed characters, which are0-9
,A-Z
,a-z
,-
, and.
(dot). -
23456789999999999999.0.0
— overflow of a u64.
Sourcepub fn cmp_precedence(&self, other: &Self) -> Ordering
pub fn cmp_precedence(&self, other: &Self) -> Ordering
Compare the major, minor, patch, and pre-release value of two versions, disregarding build metadata. Versions that differ only in build metadata are considered equal. This comparison is what the SemVer spec refers to as “precedence”.
§Example
use semver::Version;
let mut versions = [
"1.20.0+c144a98".parse::<Version>().unwrap(),
"1.20.0".parse().unwrap(),
"1.0.0".parse().unwrap(),
"1.0.0-alpha".parse().unwrap(),
"1.20.0+bc17664".parse().unwrap(),
];
// This is a stable sort, so it preserves the relative order of equal
// elements. The three 1.20.0 versions differ only in build metadata so
// they are not reordered relative to one another.
versions.sort_by(Version::cmp_precedence);
assert_eq!(versions, [
"1.0.0-alpha".parse().unwrap(),
"1.0.0".parse().unwrap(),
"1.20.0+c144a98".parse().unwrap(),
"1.20.0".parse().unwrap(),
"1.20.0+bc17664".parse().unwrap(),
]);
// Totally order the versions, including comparing the build metadata.
versions.sort();
assert_eq!(versions, [
"1.0.0-alpha".parse().unwrap(),
"1.0.0".parse().unwrap(),
"1.20.0".parse().unwrap(),
"1.20.0+bc17664".parse().unwrap(),
"1.20.0+c144a98".parse().unwrap(),
]);