1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
extern crate proc_macro;
use proc_macro::{TokenStream};
use proc_macro2::{Ident, Span};
use quote::quote;
use std::collections::HashMap;

#[proc_macro]
pub fn dotenv_consts(_item: TokenStream) -> TokenStream {
    let entries = dotenv::dotenv_iter()
        .unwrap()
        .map(|kv| kv.unwrap())
        .collect::<HashMap<_, _>>();
    
    let keys = entries.keys().map(|k| Ident::new(k, Span::call_site()));
    let values = entries.values();

    let output = quote! {
        #(
            pub const #keys: &str = #values;
        )*
    };

    output.into()
}