Skip to main content

zerolaunch_plugin_api/host/
cache_level.rs

1use serde::{Deserialize, Serialize};
2
3/// 缓存等级枚举,控制图标服务的缓存策略。
4/// 插件通过 PluginSdkConfig 注册时指定,HostApi 根据等级决定缓存行为。
5/// 跨进程经 `host/sdk_config.update` 以 camelCase 名称收发。
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
7pub enum CacheLevel {
8    /// 双层缓存(L1 → L2 → 提取 → 更新 L1+L2)。
9    /// 适用于图标被频繁提取的场景。
10    #[default]
11    #[serde(rename = "full")]
12    Full,
13    /// 跳过内存缓存(L2 → 提取 → 更新 L2)。
14    /// 适用于图标只在每次启动时提取的场景。
15    #[serde(rename = "skipMemory")]
16    SkipMemory,
17    /// 跳过所有缓存(直接提取)。
18    /// 适用于图标在几天的时间内可能只被提取一次的场景。
19    #[serde(rename = "skipAll")]
20    SkipAll,
21    /// 只读缓存(L1 → L2,L2 命中回填 L1),不触发提取/网络。
22    /// 未命中时 `get_icon` 返回错误,`get_icon_or_default` 回退默认图标。
23    /// 宿主(查询响应等零网络开销路径)与插件(`PluginSdkConfig` 自注册)都可用。
24    #[serde(rename = "cacheOnly")]
25    CacheOnly,
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    /// 跨进程键名契约:插件经 `host/sdk_config.update` 按这些字面量收发缓存等级。
33    #[test]
34    fn cache_level_wire_names_roundtrip() {
35        let cases = [
36            (CacheLevel::Full, "\"full\""),
37            (CacheLevel::SkipMemory, "\"skipMemory\""),
38            (CacheLevel::SkipAll, "\"skipAll\""),
39            (CacheLevel::CacheOnly, "\"cacheOnly\""),
40        ];
41        for (level, wire) in cases {
42            assert_eq!(serde_json::to_string(&level).unwrap(), wire);
43            assert_eq!(serde_json::from_str::<CacheLevel>(wire).unwrap(), level);
44        }
45    }
46}