Skip to main content

cdk_mintd/env_vars/
fake_wallet.rs

1//! FakeWallet environment variables
2
3use std::env;
4
5use cdk::nuts::CurrencyUnit;
6
7use crate::config::{FakeWallet, FakeWalletCustomPaymentMethod, FakeWalletKeysetRotation};
8
9// Fake Wallet environment variables
10pub const ENV_FAKE_WALLET_SUPPORTED_UNITS: &str = "CDK_MINTD_FAKE_WALLET_SUPPORTED_UNITS";
11pub const ENV_FAKE_WALLET_FEE_PERCENT: &str = "CDK_MINTD_FAKE_WALLET_FEE_PERCENT";
12pub const ENV_FAKE_WALLET_RESERVE_FEE_MIN: &str = "CDK_MINTD_FAKE_WALLET_RESERVE_FEE_MIN";
13pub const ENV_FAKE_WALLET_CUSTOM_PAYMENT_METHODS: &str =
14    "CDK_MINTD_FAKE_WALLET_CUSTOM_PAYMENT_METHODS";
15pub const ENV_FAKE_WALLET_MIN_DELAY: &str = "CDK_MINTD_FAKE_WALLET_MIN_DELAY";
16pub const ENV_FAKE_WALLET_MAX_DELAY: &str = "CDK_MINTD_FAKE_WALLET_MAX_DELAY";
17/// JSON array of keyset rotations, e.g.:
18/// `[{"unit":"sat","version":"v1","input_fee_ppk":0,"expired":true}]`
19pub const ENV_FAKE_WALLET_KEYSET_ROTATIONS: &str = "CDK_MINTD_FAKE_WALLET_KEYSET_ROTATIONS";
20
21impl FakeWallet {
22    pub fn from_env(mut self) -> Self {
23        // Supported Units - expects comma-separated list
24        if let Ok(units_str) = env::var(ENV_FAKE_WALLET_SUPPORTED_UNITS) {
25            if let Ok(units) = units_str
26                .split(',')
27                .map(|s| s.trim().parse())
28                .collect::<Result<Vec<CurrencyUnit>, _>>()
29            {
30                self.supported_units = units;
31            }
32        }
33
34        if let Ok(fee_str) = env::var(ENV_FAKE_WALLET_FEE_PERCENT) {
35            if let Ok(fee) = fee_str.parse() {
36                self.fee_percent = fee;
37            }
38        }
39
40        if let Ok(reserve_fee_str) = env::var(ENV_FAKE_WALLET_RESERVE_FEE_MIN) {
41            if let Ok(reserve_fee) = reserve_fee_str.parse::<u64>() {
42                self.reserve_fee_min = reserve_fee.into();
43            }
44        }
45
46        if let Ok(methods_str) = env::var(ENV_FAKE_WALLET_CUSTOM_PAYMENT_METHODS) {
47            self.custom_payment_methods = methods_str
48                .split(',')
49                .filter_map(parse_custom_payment_method_env)
50                .collect();
51        }
52
53        if let Ok(min_delay_str) = env::var(ENV_FAKE_WALLET_MIN_DELAY) {
54            if let Ok(min_delay) = min_delay_str.parse() {
55                self.min_delay_time = min_delay;
56            }
57        }
58
59        if let Ok(max_delay_str) = env::var(ENV_FAKE_WALLET_MAX_DELAY) {
60            if let Ok(max_delay) = max_delay_str.parse() {
61                self.max_delay_time = max_delay;
62            }
63        }
64
65        if let Ok(rotations_str) = env::var(ENV_FAKE_WALLET_KEYSET_ROTATIONS) {
66            if let Ok(rotations) =
67                serde_json::from_str::<Vec<FakeWalletKeysetRotation>>(&rotations_str)
68            {
69                self.keyset_rotations = rotations;
70            }
71        }
72
73        self
74    }
75}
76
77fn parse_custom_payment_method_env(value: &str) -> Option<FakeWalletCustomPaymentMethod> {
78    let value = value.trim();
79    if value.is_empty() {
80        return None;
81    }
82
83    let Some((method, unit)) = value.split_once(':') else {
84        return Some(FakeWalletCustomPaymentMethod::Method(value.to_string()));
85    };
86
87    let method = method.trim();
88    let unit = unit.trim();
89    if method.is_empty() || unit.is_empty() {
90        return None;
91    }
92
93    unit.parse()
94        .ok()
95        .map(|unit| FakeWalletCustomPaymentMethod::MethodForUnit {
96            method: method.to_string(),
97            unit,
98        })
99}