aboutsummaryrefslogtreecommitdiff
path: root/syntax/namespace.rs
diff options
context:
space:
mode:
Diffstat (limited to 'syntax/namespace.rs')
-rw-r--r--syntax/namespace.rs37
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 {