|
| 1 | +//! 功能开关(v0.11.1;v4 §11.3:feed 相关能力默认关闭)。 |
| 2 | +//! |
| 3 | +//! @ai-context: 项目"增强能力默认关闭"传统的统一开关位——feed_capture 控制 |
| 4 | +//! 碎片快速捕获面的可见性与 command 准入(后端不信前端隐藏); |
| 5 | +//! JSON 持久化同 vocab/ai_settings 模式(缺失/损坏回退默认不阻断)。 |
| 6 | +
|
| 7 | +use serde::{Deserialize, Serialize}; |
| 8 | + |
| 9 | +/// 功能开关集(新增开关必须默认 false——保守默认纪律)。 |
| 10 | +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] |
| 11 | +#[serde(rename_all = "camelCase", default)] |
| 12 | +pub struct FeatureFlags { |
| 13 | + /// feed 碎片快速捕获(v0.11.1 默认关——Phase 2 验证前不默认启用) |
| 14 | + pub feed_capture: bool, |
| 15 | +} |
| 16 | + |
| 17 | +impl Default for FeatureFlags { |
| 18 | + fn default() -> Self { |
| 19 | + Self { feed_capture: false } |
| 20 | + } |
| 21 | +} |
| 22 | + |
| 23 | +impl FeatureFlags { |
| 24 | + /// 从 JSON 文件加载(缺失/损坏 → 内置默认,诚实降级不阻断启动)。 |
| 25 | + pub fn load(path: &std::path::Path) -> Self { |
| 26 | + match std::fs::read_to_string(path) { |
| 27 | + Ok(s) => serde_json::from_str(&s).unwrap_or_default(), |
| 28 | + Err(_) => Self::default(), |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + /// 持久化(先写临时文件再 rename——原子写,防半截 JSON)。 |
| 33 | + pub fn save(&self, path: &std::path::Path) -> std::io::Result<()> { |
| 34 | + let json = serde_json::to_string_pretty(self).unwrap_or_default(); |
| 35 | + let tmp = path.with_extension("json.tmp"); |
| 36 | + std::fs::write(&tmp, json)?; |
| 37 | + std::fs::rename(&tmp, path)?; |
| 38 | + Ok(()) |
| 39 | + } |
| 40 | + |
| 41 | + /// 按名读取(白名单;未知开关 → None,诚实不猜)。 |
| 42 | + pub fn get(&self, name: &str) -> Option<bool> { |
| 43 | + match name { |
| 44 | + "feed_capture" => Some(self.feed_capture), |
| 45 | + _ => None, |
| 46 | + } |
| 47 | + } |
| 48 | + |
| 49 | + /// 按名写入(白名单;未知开关 → false 返回)。 |
| 50 | + pub fn set(&mut self, name: &str, value: bool) -> bool { |
| 51 | + match name { |
| 52 | + "feed_capture" => { |
| 53 | + self.feed_capture = value; |
| 54 | + true |
| 55 | + } |
| 56 | + _ => false, |
| 57 | + } |
| 58 | + } |
| 59 | +} |
| 60 | + |
| 61 | +#[cfg(test)] |
| 62 | +#[path = "feature_flags_tests.rs"] |
| 63 | +mod tests; |
0 commit comments