rpa_enum 0.1.3

RPA Enum extension.
Documentation
use std::collections::HashMap;
use proc_macro::{TokenStream};
use proc_macro2::Span;
use quote::quote;
use syn::Ident;

mod imports;
mod from_sql;
mod display;
mod from_sql_row;
mod as_expression;
mod queryable;

pub fn get_impl(enum_ident: &syn::Ident, variants: Vec<String>, attributes: HashMap<String, Vec<String>>) -> TokenStream {

    let mut optional_variant: Option<Ident> = None;

    if attributes.get("is_optional").is_some() {
        let is_optional_value = attributes.get("is_optional").unwrap().get(0).unwrap().as_str();
        optional_variant = Some(Ident::new(is_optional_value, Span::call_site()));
    }

    let mut variant_idents: HashMap<String, Ident> = HashMap::new();

    variants.iter().for_each(|variant| {
        let variant_ident = Ident::new(variant.as_str(), Span::call_site());
        variant_idents.insert(variant.to_string(), variant_ident);
    });

    let imports = imports::get_impl();
    let from_sql = from_sql::get_impl(enum_ident, &variant_idents, &optional_variant);
    let display = display::get_impl(enum_ident, &variant_idents);
    let from_sql_row = from_sql_row::get_impl(enum_ident, &variant_idents);
    let as_expression = as_expression::get_impl(enum_ident);
    let queryable = queryable::get_impl(enum_ident, &variant_idents);

    let code_generated = quote! {
        #imports
        #from_sql
        #display
        #from_sql_row
        #as_expression
        #queryable
    };

    code_generated.into()
}