]>
Commit | Line | Data |
---|---|---|
f20569fa XL |
1 | use crate::error::{Error, Result}; |
2 | use crate::iter::Iter; | |
3 | use crate::token; | |
4 | use proc_macro::Group; | |
5 | ||
6 | #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] | |
7 | pub struct Release { | |
8 | pub minor: u16, | |
9 | pub patch: Option<u16>, | |
10 | } | |
11 | ||
12 | pub 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 | ||
16 | fn 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 | } |