Skip to main content

minifly_api/
config.rs

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        // Clear relevant env vars
48        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        // Clean up
89        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        // Custom values
129        assert_eq!(config.port, 9090);
130        assert_eq!(config.data_dir, "/custom/data");
131        
132        // Default values
133        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}