1extern crate proc_macro;
2
3use quote::quote;
4use syn::{
5 parse::{Parse, ParseStream},
6 parse_macro_input, LitStr, Token,
7};
8
9struct DefaultEnv {
10 env_var: LitStr,
11 default_value: proc_macro2::TokenStream,
12}
13
14impl Parse for DefaultEnv {
15 fn parse(input: ParseStream) -> syn::parse::Result<Self> {
16 let env_var = input.parse()?;
17 input.parse::<Token![,]>()?;
18 let default_value = input.parse()?;
19 Ok(Self {
20 env_var,
21 default_value,
22 })
23 }
24}
25
26#[proc_macro]
27pub fn default_env(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
28 let DefaultEnv {
29 env_var,
30 default_value,
31 } = parse_macro_input!(input as DefaultEnv);
32
33 let var_or_default = match std::env::var(env_var.value()) {
34 Ok(var) => quote! { #var },
35 Err(_) => quote! { #default_value },
36 };
37
38 proc_macro::TokenStream::from(var_or_default)
39}