mplusfonts-macros 0.3.4

Procedural macros re-exported in the mplusfonts crate
Documentation
use syn::punctuated::Pair;
use syn::spanned::Spanned;

pub trait ExprPathExt {
    fn try_into_ident(self) -> syn::Result<syn::Ident>;
}

impl ExprPathExt for syn::ExprPath {
    fn try_into_ident(mut self) -> syn::Result<syn::Ident> {
        if let Some(ref qself) = self.qself {
            let message = "unexpected path qualifier";
            return Err(syn::Error::new(qself.span(), message));
        }

        if let Some(colon) = self.path.leading_colon {
            let message = "remove the leading colon";
            return Err(syn::Error::new_spanned(colon, message));
        }

        let segment = match self.path.segments.pop().expect("expected path segment") {
            Pair::Punctuated(_, colon) => {
                let message = "remove the trailing colon";
                return Err(syn::Error::new_spanned(colon, message));
            }
            Pair::End(segment) => segment,
        };

        if !self.path.segments.is_empty() {
            let message = "unexpected path segments";
            return Err(syn::Error::new_spanned(self.path.segments, message));
        }

        if !segment.arguments.is_empty() {
            let message = "unexpected path arguments";
            return Err(syn::Error::new_spanned(segment.arguments, message));
        }

        Ok(segment.ident)
    }
}