Skip to main content

cdk_mintd/env_vars/
mod.rs

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