2 use std::num::ParseIntError;
8 pub const VERSION_PLACEHOLDER: &str = "CURRENT_RUSTC_VERSION";
10 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
12 Explicit { parts: [u32; 3] },
16 impl fmt::Display for Version {
17 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
19 Version::Explicit { parts } => {
20 f.pad(&format!("{}.{}.{}", parts[0], parts[1], parts[2]))
22 Version::CurrentPlaceholder => f.pad(&format!("CURRENT")),
27 #[derive(Debug, PartialEq, Eq)]
28 pub enum ParseVersionError {
29 ParseIntError(ParseIntError),
33 impl From<ParseIntError> for ParseVersionError {
34 fn from(err: ParseIntError) -> Self {
35 ParseVersionError::ParseIntError(err)
39 impl FromStr for Version {
40 type Err = ParseVersionError;
42 fn from_str(s: &str) -> Result<Self, Self::Err> {
43 if s == VERSION_PLACEHOLDER {
44 return Ok(Version::CurrentPlaceholder);
46 let mut iter = s.split('.').map(|part| Ok(part.parse()?));
48 let mut part = || iter.next().unwrap_or(Err(ParseVersionError::WrongNumberOfParts));
50 let parts = [part()?, part()?, part()?];
52 if iter.next().is_some() {
53 // Ensure we don't have more than 3 parts.
54 return Err(ParseVersionError::WrongNumberOfParts);
57 Ok(Version::Explicit { parts })