Skip to main content

fishpi_sdk/model/
mod.rs

1pub mod article;
2pub mod breezemoon;
3pub mod chat;
4pub mod chatroom;
5pub mod finger;
6pub mod misc;
7pub mod notice;
8pub mod redpacket;
9pub mod user;
10
11use crate::{
12    model::user::{Metal, to_metal},
13    utils::error::Error,
14};
15use serde::{Deserialize, Deserializer};
16
17#[derive(Clone, Debug, Default, Deserialize)]
18#[allow(non_snake_case)]
19pub struct MuteItem {
20    /// 解除禁言时间戳
21    pub time: u64,
22    /// 用户头像
23    pub userAvatarURL: String,
24    /// 用户名
25    pub userName: String,
26    /// 用户昵称
27    pub userNickname: String,
28}
29
30impl MuteItem {
31    pub fn from_value(data: &serde_json::Value) -> Result<Self, Error> {
32        serde_json::from_value(data.clone())
33            .map_err(|e| Error::Parse(format!("Failed to parse MuteItem: {}", e)))
34    }
35}
36
37#[macro_export]
38macro_rules! impl_str_enum {
39    ($enum_name:ident { $($variant:ident => $str:expr),* $(,)? }) => {
40        impl std::fmt::Display for $enum_name {
41            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
42                write!(f, "{}", self.as_str())
43            }
44        }
45
46        impl std::str::FromStr for $enum_name {
47            type Err = String;
48
49            fn from_str(s: &str) -> Result<Self, Self::Err> {
50                let candidate = s.split('/').next().unwrap_or(s);
51                match candidate {
52                    $($str => Ok($enum_name::$variant),)*
53                    _ => Err(format!("Unknown {}: {}", stringify!($enum_name), s)),
54                }
55            }
56        }
57
58        impl $enum_name {
59            pub fn as_str(&self) -> &str {
60                match self {
61                    $($enum_name::$variant => $str,)*
62                }
63            }
64        }
65    };
66}
67
68pub fn bool_from_int<'de, D>(deserializer: D) -> Result<bool, D::Error>
69where
70    D: Deserializer<'de>,
71{
72    let value: i64 = Deserialize::deserialize(deserializer)?;
73    Ok(value != 0)
74}
75
76pub fn bool_from_zero<'de, D>(deserializer: D) -> Result<bool, D::Error>
77where
78    D: Deserializer<'de>,
79{
80    let value: i64 = Deserialize::deserialize(deserializer)?;
81    Ok(value == 0)
82}
83
84pub fn deserialize_sys_metal<'de, D>(deserializer: D) -> Result<Vec<Metal>, D::Error>
85where
86    D: Deserializer<'de>,
87{
88    let value: serde_json::Value = Deserialize::deserialize(deserializer)?;
89    let mut metals = Vec::new();
90
91    match value {
92        // 兼容旧格式:["{\"list\":[...]}"]
93        serde_json::Value::Array(arr) => {
94            for item in arr {
95                if let Some(s) = item.as_str() && let Ok(m) = to_metal(s) {
96                    metals.extend(m);
97                }
98            }
99        }
100        // 兼容旧格式:"{"list":[...]}"
101        serde_json::Value::String(s) => {
102            if let Ok(m) = to_metal(&s) {
103                metals.extend(m);
104            }
105        }
106        // 新格式(对象数组)当前 SDK 不消费勋章细节,这里忽略以避免影响主流程解析
107        _ => {}
108    }
109
110    Ok(metals)
111}