24 lines
641 B
Rust
24 lines
641 B
Rust
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()
|
|
}
|