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, } pub fn parse(paren: Group, iter: Iter) -> Result { try_parse(iter).map_err(|_| Error::group(paren, "expected rustc release number, like 1.31")) } fn try_parse(iter: Iter) -> Result { 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 }) }