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}