xref: /aosp_15_r20/external/cronet/third_party/rust/chromium_crates_io/vendor/rustversion-1.0.15/src/release.rs (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 
parse(paren: Group, iter: Iter) -> Result<Release>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 
try_parse(iter: Iter) -> Result<Release, ()>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 }
35