default_env/
lib.rs

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}