ztk_rust_sdk/common/
types.rs

1//! 公共类型定义
2//!
3//! 定义 SDK 中使用的公共枚举和类型
4
5use serde::{Deserialize, Serialize};
6use serde_repr::{Deserialize_repr, Serialize_repr};
7
8/// 返回结果类型
9///
10/// 控制 API 返回的数据详细程度
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
12#[repr(u8)]
13pub enum SignUrlType {
14    /// 官方结果 (默认)
15    Official = 0,
16    /// 官方结果 (同 0)
17    Official1 = 1,
18    /// 官方结果 (同 0)
19    Official2 = 2,
20    /// 整合高佣转链+解析商品编号
21    WithParse = 3,
22    /// 整合+简版详情
23    WithSimpleDetail = 4,
24    /// 整合+全网详情+淘口令
25    WithFullDetail = 5,
26}
27
28impl Default for SignUrlType {
29    fn default() -> Self {
30        SignUrlType::Official
31    }
32}
33
34/// 转链类型 (京东)
35///
36/// 控制京东转链返回的链接类型
37#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
38#[repr(u8)]
39pub enum ChainType {
40    /// 长链
41    Long = 1,
42    /// 短链
43    Short = 2,
44    /// 长链+短链
45    Both = 3,
46}
47
48impl Default for ChainType {
49    fn default() -> Self {
50        ChainType::Long
51    }
52}
53
54/// 排序方向
55///
56/// 控制查询结果的排序顺序
57#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
58#[serde(rename_all = "lowercase")]
59pub enum SortDirection {
60    /// 升序
61    Asc,
62    /// 降序
63    Desc,
64}
65
66impl Default for SortDirection {
67    fn default() -> Self {
68        SortDirection::Desc
69    }
70}
71
72/// 京粉频道 ID
73///
74/// 京东京粉精选商品的频道分类
75#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
76#[repr(u32)]
77pub enum JdEliteId {
78    /// 好券商品
79    GoodCoupon = 1,
80    /// 精选卖场
81    Selected = 2,
82    /// 9.9 包邮
83    NineNine = 10,
84    /// 京东配送
85    JdDelivery = 15,
86    /// 实时热销榜
87    HotSale = 22,
88    /// 为你推荐
89    Recommend = 23,
90    /// 数码家电
91    Digital = 24,
92    /// 超市
93    Supermarket = 25,
94    /// 母婴玩具
95    Baby = 26,
96    /// 家具日用
97    Home = 27,
98    /// 美妆穿搭
99    Beauty = 28,
100    /// 图书文具
101    Book = 30,
102    /// 今日必推
103    TodayMust = 31,
104    /// 京东好物
105    JdGood = 32,
106    /// 京东秒杀
107    Seckill = 33,
108    /// 拼购商品
109    Pingou = 34,
110    /// 高收益榜
111    HighProfit = 40,
112    /// 自营热卖榜
113    SelfHot = 41,
114    /// 秒杀进行中
115    SeckillNow = 108,
116    /// 新品首发
117    NewProduct = 109,
118    /// 自营
119    SelfOperated = 110,
120    /// 京东爆品
121    JdHot = 112,
122    /// 首购商品
123    FirstBuy = 125,
124    /// 高佣榜单
125    HighCommission = 129,
126    /// 视频商品
127    Video = 130,
128    /// 历史最低价商品榜
129    LowestPrice = 153,
130}
131
132impl Default for JdEliteId {
133    fn default() -> Self {
134        JdEliteId::GoodCoupon
135    }
136}
137
138/// 京东排序字段
139///
140/// 京东商品查询的排序字段选项
141#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
142#[serde(rename_all = "camelCase")]
143pub enum JdSortField {
144    /// 单价
145    Price,
146    /// 佣金比例
147    CommissionShare,
148    /// 佣金
149    Commission,
150    /// 30天引单量
151    InOrderCount30DaysSku,
152    /// 评论数
153    Comments,
154    /// 好评数
155    GoodComments,
156}
157
158impl Default for JdSortField {
159    fn default() -> Self {
160        JdSortField::InOrderCount30DaysSku
161    }
162}
163
164/// 订单查询类型
165///
166/// 控制订单查询的时间维度
167#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
168#[repr(u8)]
169pub enum OrderQueryType {
170    /// 按下单时间
171    OrderTime = 1,
172    /// 按完成时间
173    FinishTime = 2,
174    /// 按更新时间
175    UpdateTime = 3,
176}
177
178impl Default for OrderQueryType {
179    fn default() -> Self {
180        OrderQueryType::OrderTime
181    }
182}
183
184/// 店铺类型
185///
186/// 区分淘宝店和天猫店
187#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize_repr, Deserialize_repr)]
188#[repr(u8)]
189pub enum ShopType {
190    /// 淘宝店
191    Taobao = 0,
192    /// 天猫店
193    Tmall = 1,
194}
195
196impl Default for ShopType {
197    fn default() -> Self {
198        ShopType::Taobao
199    }
200}
201
202#[cfg(test)]
203mod tests {
204    use super::*;
205
206    #[test]
207    fn test_sign_url_type_serialize() {
208        let value = SignUrlType::WithFullDetail;
209        let json = serde_json::to_string(&value).unwrap();
210        assert_eq!(json, "5");
211    }
212
213    #[test]
214    fn test_sign_url_type_deserialize() {
215        let value: SignUrlType = serde_json::from_str("3").unwrap();
216        assert_eq!(value, SignUrlType::WithParse);
217    }
218
219    #[test]
220    fn test_chain_type_serialize() {
221        let value = ChainType::Short;
222        let json = serde_json::to_string(&value).unwrap();
223        assert_eq!(json, "2");
224    }
225
226    #[test]
227    fn test_chain_type_deserialize() {
228        let value: ChainType = serde_json::from_str("1").unwrap();
229        assert_eq!(value, ChainType::Long);
230    }
231
232    #[test]
233    fn test_sort_direction_serialize() {
234        let value = SortDirection::Asc;
235        let json = serde_json::to_string(&value).unwrap();
236        assert_eq!(json, "\"asc\"");
237    }
238
239    #[test]
240    fn test_sort_direction_deserialize() {
241        let value: SortDirection = serde_json::from_str("\"desc\"").unwrap();
242        assert_eq!(value, SortDirection::Desc);
243    }
244
245    #[test]
246    fn test_jd_elite_id_serialize() {
247        let value = JdEliteId::HotSale;
248        let json = serde_json::to_string(&value).unwrap();
249        assert_eq!(json, "22");
250    }
251
252    #[test]
253    fn test_jd_elite_id_deserialize() {
254        let value: JdEliteId = serde_json::from_str("33").unwrap();
255        assert_eq!(value, JdEliteId::Seckill);
256    }
257
258    #[test]
259    fn test_jd_sort_field_serialize() {
260        let value = JdSortField::CommissionShare;
261        let json = serde_json::to_string(&value).unwrap();
262        assert_eq!(json, "\"commissionShare\"");
263    }
264
265    #[test]
266    fn test_order_query_type_serialize() {
267        let value = OrderQueryType::UpdateTime;
268        let json = serde_json::to_string(&value).unwrap();
269        assert_eq!(json, "3");
270    }
271
272    #[test]
273    fn test_shop_type_serialize() {
274        let value = ShopType::Tmall;
275        let json = serde_json::to_string(&value).unwrap();
276        assert_eq!(json, "1");
277    }
278}