naphtha-proc-macro 0.5.0

Supporting macro crate for naphtha
Documentation
use syn::{Data::Struct, DeriveInput, Ident};

pub fn extract_table_name(attr: &::proc_macro2::TokenStream) -> Ident {
    for t in attr.clone().into_iter() {
        match t {
            ::proc_macro2::TokenTree::Group(g) => {
                let mut is_next = false;
                for t in g.stream().into_iter() {
                    match t {
                        ::proc_macro2::TokenTree::Ident(i) => {
                            let ident = ::proc_macro2::Ident::new(
                                "table_name",
                                ::proc_macro2::Span::call_site(),
                            );
                            is_next = ident == i;
                        }
                        ::proc_macro2::TokenTree::Literal(l) => {
                            if is_next {
                                let l = l.to_string();
                                return Ident::new(
                                    &l[1..l.len() - 1],
                                    ::proc_macro2::Span::call_site(),
                                );
                            }
                        }
                        _ => continue,
                    }
                }
            }
            _ => continue,
        }
    }

    panic!("Attribute table_name has not been found in {}", attr);
}

pub fn has_id(ast: &DeriveInput) -> bool {
    let data = match &ast.data {
        Struct(data) => data,
        _ => {
            return false;
        }
    };
    for field in data.fields.iter() {
        if field.ident.is_none() {
            continue;
        }
        let fieldname = field.ident.as_ref().unwrap();
        match &fieldname.to_string()[..] {
            "id" => return true,
            _ => continue,
        };
    }

    false
}