use crate::error::{Error, Result};
use crate::iter::Iter;
use crate::token;
use proc_macro::Group;
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Release {
pub minor: u16,
pub patch: Option<u16>,
}
pub fn parse(paren: Group, iter: Iter) -> Result<Release> {
try_parse(iter).map_err(|_| Error::group(paren, "expected rustc release number, like 1.31"))
}
fn try_parse(iter: Iter) -> Result<Release, ()> {
let major_minor = token::parse_literal(iter).map_err(drop)?;
let string = major_minor.to_string();
if !string.starts_with("1.") {
return Err(());
}
let minor: u16 = string[2..].parse().map_err(drop)?;
let patch = if token::parse_optional_punct(iter, '.').is_some() {
let int = token::parse_literal(iter).map_err(drop)?;
Some(int.to_string().parse().map_err(drop)?)
} else {
None
};
Ok(Release { minor, patch })
}