diff options
Diffstat (limited to 'syntax/namespace.rs')
-rw-r--r-- | syntax/namespace.rs | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/syntax/namespace.rs b/syntax/namespace.rs index 07185e18..aae865cc 100644 --- a/syntax/namespace.rs +++ b/syntax/namespace.rs @@ -3,8 +3,8 @@ use quote::IdentFragment; use std::fmt::{self, Display}; use std::iter::FromIterator; use std::slice::Iter; -use syn::parse::{Parse, ParseStream, Result}; -use syn::{Ident, Token}; +use syn::parse::{Error, Parse, ParseStream, Result}; +use syn::{Expr, Ident, Lit, Meta, Token}; mod kw { syn::custom_keyword!(namespace); @@ -24,7 +24,7 @@ impl Namespace { self.segments.iter() } - pub fn parse_bridge_attr_namespace(input: ParseStream) -> Result<Namespace> { + pub fn parse_bridge_attr_namespace(input: ParseStream) -> Result<Self> { if input.is_empty() { return Ok(Namespace::ROOT); } @@ -35,6 +35,37 @@ impl Namespace { input.parse::<Option<Token![,]>>()?; Ok(namespace) } + + pub fn parse_meta(meta: &Meta) -> Result<Self> { + if let Meta::NameValue(meta) = meta { + match &meta.value { + Expr::Lit(expr) => { + if let Lit::Str(lit) = &expr.lit { + let segments = QualifiedName::parse_quoted(lit)?.segments; + return Ok(Namespace { segments }); + } + } + Expr::Path(expr) + if expr.qself.is_none() + && expr + .path + .segments + .iter() + .all(|segment| segment.arguments.is_none()) => + { + let segments = expr + .path + .segments + .iter() + .map(|segment| segment.ident.clone()) + .collect(); + return Ok(Namespace { segments }); + } + _ => {} + } + } + Err(Error::new_spanned(meta, "unsupported namespace attribute")) + } } impl Default for &Namespace { |