cdk_mintd/env_vars/
mod.rs

1//! Environment variables module
2//!
3//! This module contains all environment variable definitions and parsing logic
4//! organized by component.
5
6mod common;
7mod database;
8mod info;
9mod ln;
10mod mint_info;
11
12#[cfg(feature = "auth")]
13mod auth;
14#[cfg(feature = "cln")]
15mod cln;
16#[cfg(feature = "fakewallet")]
17mod fake_wallet;
18#[cfg(feature = "grpc-processor")]
19mod grpc_processor;
20#[cfg(feature = "ldk-node")]
21mod ldk_node;
22#[cfg(feature = "lnbits")]
23mod lnbits;
24#[cfg(feature = "lnd")]
25mod lnd;
26#[cfg(feature = "management-rpc")]
27mod management_rpc;
28#[cfg(feature = "prometheus")]
29mod prometheus;
30
31use std::env;
32use std::str::FromStr;
33
34use anyhow::{anyhow, bail, Result};
35#[cfg(feature = "auth")]
36pub use auth::*;
37#[cfg(feature = "cln")]
38pub use cln::*;
39pub use common::*;
40pub use database::*;
41#[cfg(feature = "fakewallet")]
42pub use fake_wallet::*;
43#[cfg(feature = "grpc-processor")]
44pub use grpc_processor::*;
45#[cfg(feature = "ldk-node")]
46pub use ldk_node::*;
47pub use ln::*;
48#[cfg(feature = "lnbits")]
49pub use lnbits::*;
50#[cfg(feature = "lnd")]
51pub use lnd::*;
52#[cfg(feature = "management-rpc")]
53pub use management_rpc::*;
54pub use mint_info::*;
55#[cfg(feature = "prometheus")]
56pub use prometheus::*;
57
58use crate::config::{DatabaseEngine, LnBackend, Settings};
59
60impl Settings {
61    pub fn from_env(&mut self) -> Result<Self> {
62        if let Ok(database) = env::var(DATABASE_ENV_VAR) {
63            let engine = DatabaseEngine::from_str(&database).map_err(|err| anyhow!(err))?;
64            self.database.engine = engine;
65        }
66
67        // Parse PostgreSQL-specific configuration from environment variables
68        if self.database.engine == DatabaseEngine::Postgres {
69            self.database.postgres = Some(
70                self.database
71                    .postgres
72                    .clone()
73                    .unwrap_or_default()
74                    .from_env(),
75            );
76        }
77
78        // Parse auth database configuration from environment variables (when auth is enabled)
79        #[cfg(feature = "auth")]
80        {
81            self.auth_database = Some(crate::config::AuthDatabase {
82                postgres: Some(
83                    self.auth_database
84                        .clone()
85                        .unwrap_or_default()
86                        .postgres
87                        .unwrap_or_default()
88                        .from_env(),
89                ),
90            });
91        }
92
93        self.info = self.info.clone().from_env();
94        self.mint_info = self.mint_info.clone().from_env();
95        self.ln = self.ln.clone().from_env();
96
97        #[cfg(feature = "auth")]
98        {
99            // Check env vars for auth config even if None
100            let auth = self.auth.clone().unwrap_or_default().from_env();
101
102            // Only set auth if auth_enabled flag is true
103            if auth.auth_enabled {
104                self.auth = Some(auth);
105            } else {
106                self.auth = None;
107            }
108        }
109
110        #[cfg(feature = "management-rpc")]
111        {
112            self.mint_management_rpc = Some(
113                self.mint_management_rpc
114                    .clone()
115                    .unwrap_or_default()
116                    .from_env(),
117            );
118        }
119
120        #[cfg(feature = "prometheus")]
121        {
122            self.prometheus = Some(self.prometheus.clone().unwrap_or_default().from_env());
123        }
124
125        match self.ln.ln_backend {
126            #[cfg(feature = "cln")]
127            LnBackend::Cln => {
128                self.cln = Some(self.cln.clone().unwrap_or_default().from_env());
129            }
130            #[cfg(feature = "lnbits")]
131            LnBackend::LNbits => {
132                self.lnbits = Some(self.lnbits.clone().unwrap_or_default().from_env());
133            }
134            #[cfg(feature = "fakewallet")]
135            LnBackend::FakeWallet => {
136                self.fake_wallet = Some(self.fake_wallet.clone().unwrap_or_default().from_env());
137            }
138            #[cfg(feature = "lnd")]
139            LnBackend::Lnd => {
140                self.lnd = Some(self.lnd.clone().unwrap_or_default().from_env());
141            }
142            #[cfg(feature = "ldk-node")]
143            LnBackend::LdkNode => {
144                self.ldk_node = Some(self.ldk_node.clone().unwrap_or_default().from_env());
145            }
146            #[cfg(feature = "grpc-processor")]
147            LnBackend::GrpcProcessor => {
148                self.grpc_processor =
149                    Some(self.grpc_processor.clone().unwrap_or_default().from_env());
150            }
151            LnBackend::None => bail!("Ln backend must be set"),
152            #[allow(unreachable_patterns)]
153            _ => bail!("Selected Ln backend is not enabled in this build"),
154        }
155
156        Ok(self.clone())
157    }
158}