use dotenv::dotenv;
use proc_macro::{TokenStream, TokenTree};
use quote::quote;
use std::env;
#[proc_macro]
pub fn compile_env(input: TokenStream) -> TokenStream {
let tokens: Vec<_> = input.into_iter().collect();
let (name, default): (String, String) = match tokens.as_slice() {
[TokenTree::Literal(lit)] => (unwrap_string_literal(lit), String::new()),
[
TokenTree::Literal(lit),
TokenTree::Punct(punct),
TokenTree::Literal(default_lit),
] if punct.as_char() == ',' => {
(unwrap_string_literal(lit), unwrap_string_literal(default_lit))
},
_ => panic!("This macro only accepts one or two arguments"),
};
let _ = dotenv();
let value = env::var(name).unwrap_or_else(|_| default.to_string());
quote!(#value).into()
}
fn unwrap_string_literal(lit: &proc_macro::Literal) -> String {
let mut repr = lit.to_string();
assert!(
repr.starts_with('"') && repr.ends_with('"'),
"This macro only accepts a single, non-empty string argument"
);
repr.remove(0);
repr.pop();
repr
}