aragog-macros 0.8.0

Macros for Aragog Crate
Documentation
use proc_macro2::Span;
use syn::{spanned::Spanned, Field, Lit, Path};

pub fn get_ident(path: &Path) -> Option<String> {
    let res = path.get_ident();
    if res.is_none() {
        emit_error!(path.span(), "Expected identifier");
    }
    res.map(ToString::to_string)
}

pub fn expect_field_name(span: Span, field: Option<&Field>) -> Option<String> {
    field.map_or_else(
        || {
            emit_error!(span, "This attribute must be placed on a field");
            None
        },
        |v| Some(v.ident.as_ref().unwrap().to_string()),
    )
}

pub fn expect_no_field_name(span: Span, field: Option<&Field>) -> Option<()> {
    if field.is_some() {
        emit_error!(span, "This attribute must be placed on a field");
        None
    } else {
        Some(())
    }
}

pub fn expect_usize_lit(lit: &Lit) -> Option<usize> {
    if let Lit::Int(val) = lit {
        Some(val.base10_parse().unwrap())
    } else {
        emit_error!(lit.span(), "Expected an usize value");
        None
    }
}

pub fn expect_str_lit(lit: &Lit) -> Option<String> {
    if let Lit::Str(val) = lit {
        Some(val.value())
    } else {
        emit_error!(lit.span(), "Expected a string value");
        None
    }
}

pub fn expect_bool_lit(lit: &Lit) -> Option<bool> {
    if let Lit::Bool(val) = lit {
        Some(val.value)
    } else {
        emit_error!(lit.span(), "Expected a boolean value");
        None
    }
}