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 info;
8mod ln;
9mod mint_info;
10
11#[cfg(feature = "auth")]
12mod auth;
13#[cfg(feature = "cln")]
14mod cln;
15#[cfg(feature = "fakewallet")]
16mod fake_wallet;
17#[cfg(feature = "grpc-processor")]
18mod grpc_processor;
19#[cfg(feature = "lnbits")]
20mod lnbits;
21#[cfg(feature = "lnd")]
22mod lnd;
23#[cfg(feature = "management-rpc")]
24mod management_rpc;
25
26use std::env;
27use std::str::FromStr;
28
29use anyhow::{anyhow, bail, Result};
30#[cfg(feature = "auth")]
31pub use auth::*;
32#[cfg(feature = "cln")]
33pub use cln::*;
34pub use common::*;
35#[cfg(feature = "fakewallet")]
36pub use fake_wallet::*;
37#[cfg(feature = "grpc-processor")]
38pub use grpc_processor::*;
39pub use ln::*;
40#[cfg(feature = "lnbits")]
41pub use lnbits::*;
42#[cfg(feature = "lnd")]
43pub use lnd::*;
44#[cfg(feature = "management-rpc")]
45pub use management_rpc::*;
46pub use mint_info::*;
47
48use crate::config::{Database, DatabaseEngine, LnBackend, Settings};
49
50impl Settings {
51    pub fn from_env(&mut self) -> Result<Self> {
52        if let Ok(database) = env::var(DATABASE_ENV_VAR) {
53            let engine = DatabaseEngine::from_str(&database).map_err(|err| anyhow!(err))?;
54            self.database = Database { engine };
55        }
56
57        self.info = self.info.clone().from_env();
58        self.mint_info = self.mint_info.clone().from_env();
59        self.ln = self.ln.clone().from_env();
60
61        #[cfg(feature = "auth")]
62        {
63            // Check env vars for auth config even if None
64            let auth = self.auth.clone().unwrap_or_default().from_env();
65
66            // Only set auth if env vars are present and have non-default values
67            if auth.openid_discovery != String::default()
68                || auth.openid_client_id != String::default()
69                || auth.mint_max_bat != 0
70                || auth.enabled_mint
71                || auth.enabled_melt
72                || auth.enabled_swap
73            {
74                self.auth = Some(auth);
75            } else {
76                self.auth = None;
77            }
78        }
79
80        #[cfg(feature = "management-rpc")]
81        {
82            self.mint_management_rpc = Some(
83                self.mint_management_rpc
84                    .clone()
85                    .unwrap_or_default()
86                    .from_env(),
87            );
88        }
89
90        match self.ln.ln_backend {
91            #[cfg(feature = "cln")]
92            LnBackend::Cln => {
93                self.cln = Some(self.cln.clone().unwrap_or_default().from_env());
94            }
95            #[cfg(feature = "lnbits")]
96            LnBackend::LNbits => {
97                self.lnbits = Some(self.lnbits.clone().unwrap_or_default().from_env());
98            }
99            #[cfg(feature = "fakewallet")]
100            LnBackend::FakeWallet => {
101                self.fake_wallet = Some(self.fake_wallet.clone().unwrap_or_default().from_env());
102            }
103            #[cfg(feature = "lnd")]
104            LnBackend::Lnd => {
105                self.lnd = Some(self.lnd.clone().unwrap_or_default().from_env());
106            }
107            #[cfg(feature = "grpc-processor")]
108            LnBackend::GrpcProcessor => {
109                self.grpc_processor =
110                    Some(self.grpc_processor.clone().unwrap_or_default().from_env());
111            }
112            LnBackend::None => bail!("Ln backend must be set"),
113            #[allow(unreachable_patterns)]
114            _ => bail!("Selected Ln backend is not enabled in this build"),
115        }
116
117        Ok(self.clone())
118    }
119}