1use anyhow::Result;
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct Config {
6 pub port: u16,
7 pub database_url: String,
8 pub docker_host: Option<String>,
9 pub data_dir: String,
10 pub internal_network_prefix: String,
11 pub dns_port: u16,
12 pub litefs_port: u16,
13}
14
15impl Config {
16 pub fn from_env() -> Result<Self> {
17 Ok(Self {
18 port: std::env::var("MINIFLY_API_PORT")
19 .unwrap_or_else(|_| "4280".to_string())
20 .parse()?,
21 database_url: std::env::var("MINIFLY_DATABASE_URL")
22 .unwrap_or_else(|_| "sqlite:minifly.db".to_string()),
23 docker_host: std::env::var("DOCKER_HOST").ok(),
24 data_dir: std::env::var("MINIFLY_DATA_DIR")
25 .unwrap_or_else(|_| "./data".to_string()),
26 internal_network_prefix: std::env::var("MINIFLY_NETWORK_PREFIX")
27 .unwrap_or_else(|_| "fdaa:0:".to_string()),
28 dns_port: std::env::var("MINIFLY_DNS_PORT")
29 .unwrap_or_else(|_| "5353".to_string())
30 .parse()?,
31 litefs_port: std::env::var("MINIFLY_LITEFS_PORT")
32 .unwrap_or_else(|_| "20202".to_string())
33 .parse()?,
34 })
35 }
36}
37
38#[cfg(test)]
39mod tests {
40 use super::*;
41 use std::env;
42 use serial_test::serial;
43
44 #[test]
45 #[serial]
46 fn test_default_config() {
47 env::remove_var("MINIFLY_API_PORT");
49 env::remove_var("MINIFLY_DATABASE_URL");
50 env::remove_var("DOCKER_HOST");
51 env::remove_var("MINIFLY_DATA_DIR");
52 env::remove_var("MINIFLY_NETWORK_PREFIX");
53 env::remove_var("MINIFLY_DNS_PORT");
54 env::remove_var("MINIFLY_LITEFS_PORT");
55
56 let config = Config::from_env().unwrap();
57
58 assert_eq!(config.port, 4280);
59 assert_eq!(config.database_url, "sqlite:minifly.db");
60 assert_eq!(config.docker_host, None);
61 assert_eq!(config.data_dir, "./data");
62 assert_eq!(config.internal_network_prefix, "fdaa:0:");
63 assert_eq!(config.dns_port, 5353);
64 assert_eq!(config.litefs_port, 20202);
65 }
66
67 #[test]
68 #[serial]
69 fn test_custom_config() {
70 env::set_var("MINIFLY_API_PORT", "8080");
71 env::set_var("MINIFLY_DATABASE_URL", "sqlite:test.db");
72 env::set_var("DOCKER_HOST", "tcp://localhost:2375");
73 env::set_var("MINIFLY_DATA_DIR", "/tmp/minifly");
74 env::set_var("MINIFLY_NETWORK_PREFIX", "fd00::");
75 env::set_var("MINIFLY_DNS_PORT", "5454");
76 env::set_var("MINIFLY_LITEFS_PORT", "30303");
77
78 let config = Config::from_env().unwrap();
79
80 assert_eq!(config.port, 8080);
81 assert_eq!(config.database_url, "sqlite:test.db");
82 assert_eq!(config.docker_host, Some("tcp://localhost:2375".to_string()));
83 assert_eq!(config.data_dir, "/tmp/minifly");
84 assert_eq!(config.internal_network_prefix, "fd00::");
85 assert_eq!(config.dns_port, 5454);
86 assert_eq!(config.litefs_port, 30303);
87
88 env::remove_var("MINIFLY_API_PORT");
90 env::remove_var("MINIFLY_DATABASE_URL");
91 env::remove_var("DOCKER_HOST");
92 env::remove_var("MINIFLY_DATA_DIR");
93 env::remove_var("MINIFLY_NETWORK_PREFIX");
94 env::remove_var("MINIFLY_DNS_PORT");
95 env::remove_var("MINIFLY_LITEFS_PORT");
96 }
97
98 #[test]
99 #[serial]
100 fn test_invalid_port() {
101 env::set_var("MINIFLY_API_PORT", "invalid");
102
103 let result = Config::from_env();
104 assert!(result.is_err());
105
106 env::remove_var("MINIFLY_API_PORT");
107 }
108
109 #[test]
110 #[serial]
111 fn test_invalid_dns_port() {
112 env::set_var("MINIFLY_DNS_PORT", "99999");
113
114 let result = Config::from_env();
115 assert!(result.is_err());
116
117 env::remove_var("MINIFLY_DNS_PORT");
118 }
119
120 #[test]
121 #[serial]
122 fn test_partial_config() {
123 env::set_var("MINIFLY_API_PORT", "9090");
124 env::set_var("MINIFLY_DATA_DIR", "/custom/data");
125
126 let config = Config::from_env().unwrap();
127
128 assert_eq!(config.port, 9090);
130 assert_eq!(config.data_dir, "/custom/data");
131
132 assert_eq!(config.database_url, "sqlite:minifly.db");
134 assert_eq!(config.docker_host, None);
135 assert_eq!(config.internal_network_prefix, "fdaa:0:");
136 assert_eq!(config.dns_port, 5353);
137 assert_eq!(config.litefs_port, 20202);
138
139 env::remove_var("MINIFLY_API_PORT");
140 env::remove_var("MINIFLY_DATA_DIR");
141 }
142}