]> git.lizzy.rs Git - rust.git/blob - src/tools/tidy/src/features/version.rs
Auto merge of #102700 - oli-obk:0xDEAD_TAIT, r=compiler-errors
[rust.git] / src / tools / tidy / src / features / version.rs
1 use std::fmt;
2 use std::num::ParseIntError;
3 use std::str::FromStr;
4
5 #[cfg(test)]
6 mod tests;
7
8 pub const VERSION_PLACEHOLDER: &str = "CURRENT_RUSTC_VERSION";
9
10 #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
11 pub enum Version {
12     Explicit { parts: [u32; 3] },
13     CurrentPlaceholder,
14 }
15
16 impl fmt::Display for Version {
17     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
18         match self {
19             Version::Explicit { parts } => {
20                 f.pad(&format!("{}.{}.{}", parts[0], parts[1], parts[2]))
21             }
22             Version::CurrentPlaceholder => f.pad(&format!("CURRENT")),
23         }
24     }
25 }
26
27 #[derive(Debug, PartialEq, Eq)]
28 pub enum ParseVersionError {
29     ParseIntError(ParseIntError),
30     WrongNumberOfParts,
31 }
32
33 impl From<ParseIntError> for ParseVersionError {
34     fn from(err: ParseIntError) -> Self {
35         ParseVersionError::ParseIntError(err)
36     }
37 }
38
39 impl FromStr for Version {
40     type Err = ParseVersionError;
41
42     fn from_str(s: &str) -> Result<Self, Self::Err> {
43         if s == VERSION_PLACEHOLDER {
44             return Ok(Version::CurrentPlaceholder);
45         }
46         let mut iter = s.split('.').map(|part| Ok(part.parse()?));
47
48         let mut part = || iter.next().unwrap_or(Err(ParseVersionError::WrongNumberOfParts));
49
50         let parts = [part()?, part()?, part()?];
51
52         if iter.next().is_some() {
53             // Ensure we don't have more than 3 parts.
54             return Err(ParseVersionError::WrongNumberOfParts);
55         }
56
57         Ok(Version::Explicit { parts })
58     }
59 }