default-env 0.1.1

The `env!` macro but with a default value.
Documentation
extern crate proc_macro;

use quote::quote;
use syn::{
    parse::{Parse, ParseStream},
    parse_macro_input, LitStr, Token,
};

struct DefaultEnv {
    env_var: LitStr,
    default_value: proc_macro2::TokenStream,
}

impl Parse for DefaultEnv {
    fn parse(input: ParseStream) -> syn::parse::Result<Self> {
        let env_var = input.parse()?;
        input.parse::<Token![,]>()?;
        let default_value = input.parse()?;
        Ok(Self {
            env_var,
            default_value,
        })
    }
}

#[proc_macro]
pub fn default_env(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let DefaultEnv {
        env_var,
        default_value,
    } = parse_macro_input!(input as DefaultEnv);

    let var_or_default = match std::env::var(env_var.value()) {
        Ok(var) => quote! { #var },
        Err(_) => quote! { #default_value },
    };

    proc_macro::TokenStream::from(var_or_default)
}