extern crate proc_macro;

use proc_macro::TokenStream;
use quote::quote;

use syn::{parse_macro_input, DeriveInput};

#[proc_macro_derive(ConfigOption)]
pub fn derive(input: TokenStream) -> TokenStream {
    let DeriveInput { ident, .. } = parse_macro_input!(input as DeriveInput);

    let result = quote! {
        impl From<&Config> for Option<#ident> {
            fn from(config: &Config) -> Self {
                match config.values.get(&ConfigName::#ident) {
                    Some(ConfigOption::#ident(val)) => Some(val.clone()),
                    _ => None,
                }
            }
        }
    };
    result.into()
}