Skip to main content

rust_webx_core/
mode.rs

1//! Application mode: Development vs Production.
2//!
3//! Controls framework behavior such as startup banner verbosity
4//! and built-in request logging.
5//!
6//! 环境识别遵循 ASP.NET Core 约定:
7//! 1. 环境变量 `APP_ENV`(不区分大小写)显式指定,取值 `Production`/`Prod` 或
8//!    `Development`/`Dev`;
9//! 2. 未设置时默认 `Development`。
10//!
11//! 框架据此自动加载 `appsettings.{Environment}.json` overlay。
12
13/// Controls how the framework behaves at startup and at runtime.
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
15pub enum AppMode {
16    /// Full startup banner, per-request console logging, verbose diagnostics.
17    #[default]
18    Development,
19    /// Minimal one-line startup message, no framework-initiated console logging.
20    Production,
21}
22
23impl AppMode {
24    /// 环境模式对应的 overlay 文件名,如 `appsettings.Development.json`。
25    pub fn overlay_filename(&self) -> &'static str {
26        match self {
27            AppMode::Development => "appsettings.Development.json",
28            AppMode::Production => "appsettings.Production.json",
29        }
30    }
31
32    /// 从环境变量 `APP_ENV` 解析运行模式;未设置或值非法时返回 `Development`。
33    ///
34    /// 接受(不区分大小写):`Production` / `Prod` / `Development` / `Dev`。
35    pub fn from_env() -> Self {
36        Self::from_env_var("APP_ENV")
37    }
38
39    /// 从指定环境变量名解析运行模式。
40    pub fn from_env_var(var: &str) -> Self {
41        match std::env::var(var) {
42            Ok(raw) => match raw.trim().to_lowercase().as_str() {
43                "production" | "prod" => AppMode::Production,
44                "development" | "dev" => AppMode::Development,
45                _ => {
46                    eprintln!(
47                        "[AppMode] Invalid {}='{}'; expected Production/Development. Falling back to Development.",
48                        var, raw
49                    );
50                    AppMode::Development
51                }
52            },
53            Err(_) => AppMode::Development,
54        }
55    }
56}