yggdrasil/config.rs
1//! 启动期一次性加载的进程级配置(Tier B:重启生效)。
2//!
3//! 这些配置原本经环境变量在首次请求时经 LazyLock 读取(限流器等)。
4//! 迁移到 settings 表后,启动时由 main.rs 从 DB 加载并写入此处的 OnceLock;
5//! 各 LazyLock 静态量改为从 [`rate_limit`] 读取,而非直接读环境变量。
6//!
7//! 与 Tier A(SecuritySettings / ImageCacheSettings)不同,Tier B 配置被烘焙进
8//! LazyLock 静态量,首次请求时构造即固化,修改 DB 值需重启进程才能生效。
9//!
10//! `set_*` 与 getter 仅在 server feature(测试构建保留)下编译;未初始化时回退默认值。
11#![cfg(any(feature = "server", test))]
12
13use crate::models::settings::{
14 ImageLimitSettings, RateLimitSettings, RunnerSettings, WebpSettings,
15};
16use std::sync::OnceLock;
17
18// ============================================================================
19// 限流配置
20// ============================================================================
21
22/// 限流配置(启动时从 DB 加载一次)。
23static RATE_LIMIT_CFG: OnceLock<RateLimitSettings> = OnceLock::new();
24
25/// 在启动时写入限流配置(仅调用一次)。
26///
27/// 若已设置则忽略后续调用——正常流程中 main.rs 仅调用一次。
28#[cfg(feature = "server")]
29pub fn set_rate_limit(cfg: RateLimitSettings) {
30 if RATE_LIMIT_CFG.set(cfg).is_err() {
31 tracing::warn!("rate_limit config already initialized, ignoring subsequent set");
32 }
33}
34
35/// 读取限流配置。
36///
37/// OnceLock 已设置则返回其值;未设置(如单元测试 / 启动极早期)回退到
38/// [`RateLimitSettings::default`]。
39pub fn rate_limit() -> RateLimitSettings {
40 RATE_LIMIT_CFG.get().cloned().unwrap_or_default()
41}
42
43// ============================================================================
44// WebP 编码配置
45// ============================================================================
46
47/// WebP 编码配置(启动时从 DB 加载一次)。
48static WEBP_CFG: OnceLock<WebpSettings> = OnceLock::new();
49
50/// 在启动时写入 WebP 配置(仅调用一次)。
51#[cfg(feature = "server")]
52pub fn set_webp(cfg: WebpSettings) {
53 if WEBP_CFG.set(cfg).is_err() {
54 tracing::warn!("webp config already initialized, ignoring subsequent set");
55 }
56}
57
58/// 读取 WebP 配置。未设置时回退到 [`WebpSettings::default`]。
59pub fn webp() -> WebpSettings {
60 WEBP_CFG.get().cloned().unwrap_or_default()
61}
62
63// ============================================================================
64// 图片尺寸限制配置
65// ============================================================================
66
67/// 图片尺寸限制配置(启动时从 DB 加载一次)。
68static IMAGE_LIMIT_CFG: OnceLock<ImageLimitSettings> = OnceLock::new();
69
70/// 在启动时写入图片尺寸限制配置(仅调用一次)。
71#[cfg(feature = "server")]
72pub fn set_image_limit(cfg: ImageLimitSettings) {
73 if IMAGE_LIMIT_CFG.set(cfg).is_err() {
74 tracing::warn!("image_limit config already initialized, ignoring subsequent set");
75 }
76}
77
78/// 读取图片尺寸限制配置。未设置时回退到 [`ImageLimitSettings::default`]。
79pub fn image_limit() -> ImageLimitSettings {
80 IMAGE_LIMIT_CFG.get().cloned().unwrap_or_default()
81}
82
83// ============================================================================
84// 代码运行器配置
85// ============================================================================
86
87/// 代码运行器配置(启动时从 DB 加载一次)。
88static RUNNER_CFG: OnceLock<RunnerSettings> = OnceLock::new();
89
90/// 在启动时写入代码运行器配置(仅调用一次)。
91#[cfg(feature = "server")]
92pub fn set_runner(cfg: RunnerSettings) {
93 if RUNNER_CFG.set(cfg).is_err() {
94 tracing::warn!("runner config already initialized, ignoring subsequent set");
95 }
96}
97
98/// 读取代码运行器配置。未设置时回退到 [`RunnerSettings::default`]。
99pub fn runner() -> RunnerSettings {
100 RUNNER_CFG.get().cloned().unwrap_or_default()
101}