blob: a3400931000cd06462e015504c70f9df5de2bfef [file] [log] [blame]
David Tolnay6c9a6222020-09-06 23:08:57 -07001use syn::ext::IdentExt;
David Tolnaydd26bd02020-09-06 23:00:17 -07002use syn::parse::{ParseStream, Result};
David Tolnay6c9a6222020-09-06 23:08:57 -07003use syn::{Ident, Token};
David Tolnaydd26bd02020-09-06 23:00:17 -07004
5pub struct QualifiedName {
6 pub segments: Vec<Ident>,
7}
8
9impl QualifiedName {
10 pub fn parse_unquoted(input: ParseStream) -> Result<Self> {
David Tolnay6c9a6222020-09-06 23:08:57 -070011 let mut segments = Vec::new();
12 let mut trailing_punct = true;
13 while trailing_punct && input.peek(Ident::peek_any) {
14 let ident = Ident::parse_any(input)?;
15 segments.push(ident);
16 let colons: Option<Token![::]> = input.parse()?;
17 trailing_punct = colons.is_some();
18 }
19 if segments.is_empty() {
20 return Err(input.error("expected path"));
21 } else if trailing_punct {
22 return Err(input.error("expected path segment"));
David Tolnaydd26bd02020-09-06 23:00:17 -070023 }
24 Ok(QualifiedName { segments })
25 }
26}