switchgear_server/
config.rs

1use serde::{Deserialize, Serialize};
2use std::collections::HashSet;
3use std::net::SocketAddr;
4use std::path::PathBuf;
5
6#[derive(Clone, Debug, Serialize, Deserialize)]
7#[serde(rename_all = "kebab-case")]
8pub struct ServerConfig {
9    pub lnurl_service: Option<LnUrlBalancerServiceConfig>,
10    pub discovery_service: Option<DiscoveryServiceConfig>,
11    pub offer_service: Option<OfferServiceConfig>,
12    pub store: Option<ServerStoreConfig>,
13}
14
15#[derive(Debug, Clone, Serialize, Deserialize)]
16#[serde(rename_all = "kebab-case")]
17pub struct LnUrlBalancerServiceConfig {
18    pub partitions: HashSet<String>,
19    pub address: SocketAddr,
20    pub health_check_frequency_secs: f64,
21    pub parallel_health_check: bool,
22    pub health_check_consecutive_success_to_healthy: usize,
23    pub health_check_consecutive_failure_to_unhealthy: usize,
24    pub backend_update_frequency_secs: f64,
25    pub invoice_expiry_secs: u64,
26    pub allowed_hosts: HashSet<String>,
27    pub backoff: BackoffConfig,
28    pub backend_selection: BackendSelectionConfig,
29    pub tls: Option<TlsConfig>,
30    pub ln_client_timeout_secs: f64,
31    pub selection_capacity_bias: Option<f64>,
32    pub comment_allowed: Option<u32>,
33}
34
35#[derive(Debug, Clone, Serialize, Deserialize)]
36#[serde(rename_all = "kebab-case")]
37pub struct DiscoveryServiceConfig {
38    pub address: SocketAddr,
39    pub auth_authority: PathBuf,
40    pub tls: Option<TlsConfig>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(rename_all = "kebab-case")]
45pub struct OfferServiceConfig {
46    pub address: SocketAddr,
47    pub auth_authority: PathBuf,
48    pub tls: Option<TlsConfig>,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize)]
52#[serde(tag = "type", rename_all = "kebab-case")]
53pub enum BackoffConfig {
54    Stop,
55    #[serde(rename_all = "kebab-case")]
56    Exponential {
57        initial_interval_secs: Option<f64>,
58        randomization_factor: Option<f64>,
59        multiplier: Option<f64>,
60        max_interval_secs: Option<f64>,
61        max_elapsed_time_secs: Option<f64>,
62    },
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize)]
66#[serde(rename_all = "kebab-case")]
67pub enum BackendSelectionConfig {
68    RoundRobin,
69    Random,
70    Consistent { max_iterations: usize },
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "kebab-case")]
75pub struct ServerStoreConfig {
76    pub offer: Option<OfferStoreConfig>,
77    pub discover: Option<DiscoveryStoreConfig>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81#[serde(tag = "type", rename_all = "kebab-case")]
82pub enum OfferStoreConfig {
83    #[serde(rename_all = "kebab-case")]
84    Database {
85        database_url: String,
86        max_connections: u32,
87    },
88    Memory,
89    #[serde(rename_all = "kebab-case")]
90    Http {
91        base_url: String,
92        connect_timeout_secs: f64,
93        total_timeout_secs: f64,
94        trusted_roots: Vec<PathBuf>,
95        authorization: PathBuf,
96    },
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
100#[serde(tag = "type", rename_all = "kebab-case")]
101pub enum DiscoveryStoreConfig {
102    #[serde(rename_all = "kebab-case")]
103    Database {
104        database_url: String,
105        max_connections: u32,
106    },
107    Memory,
108    #[serde(rename_all = "kebab-case")]
109    Http {
110        base_url: String,
111        connect_timeout_secs: f64,
112        total_timeout_secs: f64,
113        trusted_roots: Vec<PathBuf>,
114        authorization: PathBuf,
115    },
116    #[serde(rename_all = "kebab-case")]
117    File {
118        storage_dir: String,
119    },
120}
121
122#[derive(Clone, Debug, Serialize, Deserialize)]
123#[serde(rename_all = "kebab-case")]
124pub struct TlsConfig {
125    pub cert_path: PathBuf,
126    pub key_path: PathBuf,
127}