cdk_mintd/env_vars/
management_rpc.rs1use std::env;
4
5use crate::config::MintManagementRpc;
6
7pub const ENV_MINT_MANAGEMENT_ENABLED: &str = "CDK_MINTD_MANAGEMENT_ENABLED";
9pub const ENV_MINT_MANAGEMENT_ENABLED_LEGACY: &str = "CDK_MINTD_MINT_MANAGEMENT_ENABLED";
10pub const ENV_MINT_MANAGEMENT_ADDRESS: &str = "CDK_MINTD_MANAGEMENT_ADDRESS";
11pub const ENV_MINT_MANAGEMENT_PORT: &str = "CDK_MINTD_MANAGEMENT_PORT";
12pub const ENV_MINT_MANAGEMENT_TLS_DIR_PATH: &str = "CDK_MINTD_MANAGEMENT_TLS_DIR_PATH";
13
14impl MintManagementRpc {
15 pub fn from_env(mut self) -> Self {
16 if let Ok(enabled) = env::var(ENV_MINT_MANAGEMENT_ENABLED)
17 .or_else(|_| env::var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY))
18 {
19 if let Ok(enabled) = enabled.parse() {
20 self.enabled = enabled;
21 }
22 }
23
24 if let Ok(address) = env::var(ENV_MINT_MANAGEMENT_ADDRESS) {
25 self.address = Some(address);
26 }
27
28 if let Ok(port) = env::var(ENV_MINT_MANAGEMENT_PORT) {
29 if let Ok(port) = port.parse::<u16>() {
30 self.port = Some(port);
31 }
32 }
33
34 if let Ok(tls_path) = env::var(ENV_MINT_MANAGEMENT_TLS_DIR_PATH) {
35 self.tls_dir_path = Some(tls_path.into());
36 }
37
38 self
39 }
40}
41
42#[cfg(test)]
43mod tests {
44 use std::collections::BTreeSet;
45 use std::path::PathBuf;
46
47 use super::*;
48
49 fn env_lock() -> std::sync::MutexGuard<'static, ()> {
50 static ENV_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
51
52 ENV_LOCK
53 .lock()
54 .expect("management RPC env test lock should not be poisoned")
55 }
56
57 fn clear_env_vars() {
58 env::remove_var(ENV_MINT_MANAGEMENT_ENABLED);
59 env::remove_var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY);
60 env::remove_var(ENV_MINT_MANAGEMENT_ADDRESS);
61 env::remove_var(ENV_MINT_MANAGEMENT_PORT);
62 env::remove_var(ENV_MINT_MANAGEMENT_TLS_DIR_PATH);
63 }
64
65 #[test]
66 fn management_env_var_names_share_consistent_prefix() {
67 let names = [
68 ENV_MINT_MANAGEMENT_ENABLED,
69 ENV_MINT_MANAGEMENT_ADDRESS,
70 ENV_MINT_MANAGEMENT_PORT,
71 ENV_MINT_MANAGEMENT_TLS_DIR_PATH,
72 ];
73
74 let prefixes: BTreeSet<&str> = names
75 .iter()
76 .map(|name| {
77 let idx = name
78 .find("MANAGEMENT")
79 .expect("management env var name should contain MANAGEMENT");
80 &name[..idx]
81 })
82 .collect();
83
84 assert_eq!(
85 prefixes.len(),
86 1,
87 "inconsistent management RPC env var prefixes: {prefixes:?}"
88 );
89 }
90
91 #[test]
92 fn management_rpc_from_env_reads_canonical_env_vars() {
93 let _guard = env_lock();
94 clear_env_vars();
95
96 env::set_var(ENV_MINT_MANAGEMENT_ENABLED, "true");
97 env::set_var(ENV_MINT_MANAGEMENT_ADDRESS, "0.0.0.0");
98 env::set_var(ENV_MINT_MANAGEMENT_PORT, "10000");
99 env::set_var(ENV_MINT_MANAGEMENT_TLS_DIR_PATH, "/var/lib/cdk/tls");
100
101 let management_rpc = MintManagementRpc::default().from_env();
102
103 assert!(management_rpc.enabled);
104 assert_eq!(management_rpc.address.as_deref(), Some("0.0.0.0"));
105 assert_eq!(management_rpc.port, Some(10000));
106 assert_eq!(
107 management_rpc.tls_dir_path,
108 Some(PathBuf::from("/var/lib/cdk/tls"))
109 );
110
111 clear_env_vars();
112 }
113
114 #[test]
115 fn management_rpc_from_env_still_reads_legacy_enabled_env_var() {
116 let _guard = env_lock();
117 clear_env_vars();
118
119 env::set_var(ENV_MINT_MANAGEMENT_ENABLED_LEGACY, "true");
120
121 let management_rpc = MintManagementRpc::default().from_env();
122
123 assert!(management_rpc.enabled);
124
125 clear_env_vars();
126 }
127
128 #[test]
129 fn management_rpc_from_env_allows_no_tls_configuration() {
130 let _guard = env_lock();
131 clear_env_vars();
132
133 env::set_var(ENV_MINT_MANAGEMENT_ENABLED, "true");
134
135 let management_rpc = MintManagementRpc::default().from_env();
136
137 assert!(management_rpc.enabled);
138 assert_eq!(management_rpc.tls_dir_path, None);
139
140 clear_env_vars();
141 }
142}