Skip to main content

zerolaunch_plugin_api/services/
icon_request.rs

1use bincode_next::Encode;
2use serde::{Deserialize, Serialize};
3
4/// 图标请求类型,表示不同来源的图标提取需求。
5/// 各类型使用各自的提取逻辑完成图标提取。
6#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Encode)]
7#[serde(tag = "type", content = "value")]
8pub enum IconRequest {
9    /// 本地文件路径 (exe, lnk, url, ico, png) -> 提取文件图标
10    #[serde(rename = "path")]
11    Path(String),
12    /// 网址 -> 下载或查找本地域名图标库
13    #[serde(rename = "url")]
14    Url(String),
15    /// 文件扩展名 (.txt, .doc) -> 获取系统关联图标
16    #[serde(rename = "extension")]
17    Extension(String),
18    /// 已编码的图标数据(data URL 或 base64)-> 解码直通,不做文件/网络提取
19    #[serde(rename = "data")]
20    Data(String),
21}
22
23impl IconRequest {
24    /// 返回内部字符串值,用于 bridge 层到前端的向后兼容转换。
25    pub fn value(&self) -> &str {
26        match self {
27            IconRequest::Path(s) | IconRequest::Url(s) | IconRequest::Extension(s) => s.as_str(),
28            IconRequest::Data(s) => s.as_str(),
29        }
30    }
31
32    /// 判断图标请求是否为空(无意义的图标数据)。
33    pub fn is_empty(&self) -> bool {
34        self.value().is_empty()
35    }
36
37    /// 计算图标请求的 blake3 哈希值,用作缓存键。
38    pub fn get_hash_string(&self) -> String {
39        let mut hasher = blake3::Hasher::new();
40        let _ = bincode_next::encode_into_std_write(
41            self,
42            &mut hasher,
43            bincode_next::config::standard(),
44        );
45        hasher.finalize().to_hex().to_string()
46    }
47}