rustversion/
release.rs

1use crate::error::{Error, Result};
2use crate::iter::Iter;
3use crate::token;
4use proc_macro::Group;
5
6#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
7pub struct Release {
8    pub minor: u16,
9    pub patch: Option<u16>,
10}
11
12pub fn parse(paren: Group, iter: Iter) -> Result<Release> {
13    try_parse(iter).map_err(|()| Error::group(paren, "expected rustc release number, like 1.31"))
14}
15
16fn try_parse(iter: Iter) -> Result<Release, ()> {
17    let major_minor = token::parse_literal(iter).map_err(drop)?;
18    let string = major_minor.to_string();
19
20    if !string.starts_with("1.") {
21        return Err(());
22    }
23
24    let minor: u16 = string[2..].parse().map_err(drop)?;
25
26    let patch = if token::parse_optional_punct(iter, '.').is_some() {
27        let int = token::parse_literal(iter).map_err(drop)?;
28        Some(int.to_string().parse().map_err(drop)?)
29    } else {
30        None
31    };
32
33    Ok(Release { minor, patch })
34}