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>5 pub(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