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}