1extern crate proc_macro;
2
3mod codecs;
4mod default_env;
5
6use proc_macro::TokenStream;
7use quote::quote;
8use syn::parse_macro_input;
9use syn::LitStr;
10
11#[proc_macro]
12pub fn program_id_from_env(input: TokenStream) -> TokenStream {
13 let self::default_env::DefaultEnv {
14 env_var,
15 default_value,
16 } = parse_macro_input!(input as self::default_env::DefaultEnv);
17
18 let var_or_default = match std::env::var(env_var.value()) {
19 Ok(var) => quote! { #var },
20 Err(_) => quote! { #default_value },
21 };
22 let resolved = TokenStream::from(var_or_default);
23 let value: LitStr = syn::parse(resolved).unwrap();
24 let tokens: proc_macro2::TokenStream = self::codecs::parse_bs58(&value).unwrap();
25 let output = TokenStream::from(tokens);
26
27 output
28}