Skip to main content

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}