easy_msr_api/
config.rs

1//! # 配置管理模块
2//! 
3//! 提供应用程序配置的加载和管理功能。
4//! 
5//! 支持从环境变量加载配置,包括服务器端口和远程API地址。
6//! 使用`.env`文件支持本地开发配置。
7
8use dotenvy::dotenv;
9use std::env;
10use url::Url;
11
12/// 应用程序配置
13/// 
14/// 包含服务器运行所需的所有配置项。
15/// 支持从环境变量加载,并提供合理的默认值。
16#[derive(Clone, Debug)]
17pub struct Config {
18    /// 服务器监听端口
19    /// 
20    /// 默认值为8080,可通过`SERVER_PORT`环境变量设置
21    pub server_port: u16,
22    
23    /// 远程API基础URL
24    /// 
25    /// 默认值为MSR官方API地址,可通过`REMOTE_BASE`环境变量设置
26    pub remote_base: String,
27}
28
29impl Config {
30    /// 从环境变量加载配置
31    /// 
32    /// 加载`.env`文件(如果存在),然后从环境变量读取配置。
33    /// 如果环境变量不存在,则使用默认值。
34    /// 
35    /// # 返回
36    /// 
37    /// 返回配置实例或配置错误
38    /// 
39    /// # 示例
40    /// 
41    /// ```rust
42    /// use easy_msr_api::config::Config;
43    /// 
44    /// let config = Config::from_env().unwrap();
45    /// println!("服务器端口: {}", config.server_port);
46    /// ```
47    pub fn from_env() -> Result<Self, crate::error::AppError> {
48        dotenv().ok();
49        
50        let server_port = env::var("SERVER_PORT")
51            .unwrap_or_else(|_| "8080".into())
52            .parse()
53            .map_err(|_| crate::error::AppError::Config("SERVER_PORT必须是有效的端口号".into()))?;
54        
55        let remote_base = env::var("REMOTE_BASE")
56            .unwrap_or_else(|_| "https://monster-siren.hypergryph.com/api".into());
57        
58        // 验证URL格式
59        Url::parse(&remote_base)
60            .map_err(|_| crate::error::AppError::Config("REMOTE_BASE必须是有效的URL".into()))?;
61        
62        Ok(Self {
63            server_port,
64            remote_base,
65        })
66    }
67    
68    /// 获取服务器监听地址
69    /// 
70    /// 返回格式为`0.0.0.0:端口`的监听地址字符串。
71    /// 
72    /// # 示例
73    /// 
74    /// ```rust
75    /// use easy_msr_api::config::Config;
76    /// 
77    /// let config = Config::from_env().unwrap();
78    /// let addr = config.server_addr();
79    /// assert_eq!(addr, "0.0.0.0:8080");
80    /// ```
81    pub fn server_addr(&self) -> String {
82        format!("0.0.0.0:{}", self.server_port)
83    }
84}