1 use syn::parse::{Error, Result}; 2 use syn::{parse_quote, Attribute, Path}; 3 4 // #[linkme(crate = path::to::linkme)] linkme_path(attrs: &mut Vec<Attribute>) -> Result<Path>5pub(crate) fn linkme_path(attrs: &mut Vec<Attribute>) -> Result<Path> { 6 let mut linkme_path = None; 7 let mut errors: Option<Error> = None; 8 9 attrs.retain(|attr| { 10 if !attr.path().is_ident("linkme") { 11 return true; 12 } 13 if let Err(err) = attr.parse_nested_meta(|meta| { 14 if meta.path.is_ident("crate") { 15 if linkme_path.is_some() { 16 return Err(meta.error("duplicate linkme crate attribute")); 17 } 18 let path = meta.value()?.call(Path::parse_mod_style)?; 19 linkme_path = Some(path); 20 Ok(()) 21 } else { 22 Err(meta.error("unsupported linkme attribute")) 23 } 24 }) { 25 match &mut errors { 26 None => errors = Some(err), 27 Some(errors) => errors.combine(err), 28 } 29 } 30 false 31 }); 32 33 match errors { 34 None => Ok(linkme_path.unwrap_or_else(|| parse_quote!(::linkme))), 35 Some(errors) => Err(errors), 36 } 37 } 38