use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
pub struct ElemeConvertResponse {
#[serde(rename = "alibaba_alsc_union_eleme_promotion_officialactivity_get_response")]
pub response: Option<ElemePromotionResponse>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ElemePromotionResponse {
#[serde(default)]
pub data: Option<ElemeActivityData>,
#[serde(default)]
pub message: Option<String>,
#[serde(default)]
pub request_id: Option<String>,
#[serde(default)]
pub result_code: Option<i32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ElemeActivityData {
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub end_time: Option<i64>,
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub link: Option<ElemeLink>,
#[serde(default)]
pub picture: Option<String>,
#[serde(default)]
pub start_time: Option<i64>,
#[serde(default)]
pub title: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ElemeLink {
#[serde(default)]
pub alipay_mini_url: Option<String>,
#[serde(default)]
pub ele_scheme_url: Option<String>,
#[serde(default)]
pub h5_short_link: Option<String>,
#[serde(default)]
pub h5_url: Option<String>,
#[serde(default)]
pub mini_qrcode: Option<String>,
#[serde(default)]
pub picture: Option<String>,
#[serde(default)]
pub tb_mini_qrcode: Option<String>,
#[serde(default)]
pub tb_qr_code: Option<String>,
#[serde(default)]
pub wx_appid: Option<String>,
#[serde(default)]
pub wx_path: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ElemeOrderResponse {
#[serde(default)]
pub status: Option<i32>,
#[serde(default)]
pub content: Option<Vec<ElemeOrderInfo>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct ElemeOrderInfo {
#[serde(default)]
pub code: Option<String>,
#[serde(default)]
pub account: Option<String>,
#[serde(default)]
pub appkey_ztk: Option<String>,
#[serde(default)]
pub sid: Option<String>,
#[serde(default)]
pub is_jiesuan: Option<String>,
#[serde(default)]
pub jiesuan_time: Option<String>,
#[serde(default)]
pub jiesuan_profit: Option<String>,
#[serde(default)]
pub orderid: Option<String>,
#[serde(default)]
pub paytime: Option<String>,
#[serde(default)]
pub payprice: Option<String>,
#[serde(default)]
pub profit: Option<f64>,
#[serde(default)]
pub smstitle: Option<String>,
#[serde(default)]
pub refundprice: Option<f64>,
#[serde(default)]
pub refundtime: Option<String>,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub update_time: Option<String>,
#[serde(default, rename = "type")]
pub order_type: Option<String>,
#[serde(default)]
pub sid_ztk: Option<String>,
#[serde(default)]
pub customer_id_ztk: Option<String>,
#[serde(default)]
pub platform_ztk: Option<String>,
#[serde(default, rename = "actId")]
pub act_id: Option<String>,
#[serde(default)]
pub san_pingtai: Option<String>,
#[serde(default)]
pub san_pingtai_id: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_eleme_convert_response_deserialize() {
let json = r#"{
"alibaba_alsc_union_eleme_promotion_officialactivity_get_response": {
"data": {
"description": "最高抢66元大额红包",
"end_time": 1714492799,
"id": "10144",
"link": {
"alipay_mini_url": "alipays://platformapi/startapp?appId=2021001110676437",
"ele_scheme_url": "eleme://web?action=ali.open.nav",
"h5_short_link": "https://u.ele.me/Rel9JsB9",
"h5_url": "https://fc.ele.me/a/test",
"wx_appid": "wxece3a9a4c82f58c9",
"wx_path": "commercialize/pages/taoke-guide/index"
},
"picture": "https://img.alicdn.com/test.png",
"start_time": 1649865600,
"title": "饿了么天天领红包"
},
"message": "success",
"request_id": "15s3jznf0in4t",
"result_code": 0
}
}"#;
let response: ElemeConvertResponse = serde_json::from_str(json).unwrap();
assert!(response.response.is_some());
let inner = response.response.unwrap();
assert_eq!(inner.message, Some("success".to_string()));
assert_eq!(inner.result_code, Some(0));
let data = inner.data.unwrap();
assert_eq!(data.id, Some("10144".to_string()));
assert_eq!(data.title, Some("饿了么天天领红包".to_string()));
let link = data.link.unwrap();
assert_eq!(
link.h5_short_link,
Some("https://u.ele.me/Rel9JsB9".to_string())
);
}
#[test]
fn test_eleme_order_response_deserialize() {
let json = r#"{
"status": 200,
"content": [
{
"code": "15",
"account": "test@example.com",
"appkey_ztk": "a2a33cacfb1f4005b818ffd0ab7c951d",
"sid": "16ztk",
"is_jiesuan": "0",
"jiesuan_time": "",
"jiesuan_profit": "1.16",
"orderid": "105518514197820013",
"paytime": "2021/04/27 12:22:09",
"payprice": "21.50",
"profit": 1.29,
"smstitle": "饿了么外卖订单",
"refundprice": 0,
"refundtime": "",
"status": "8",
"update_time": "",
"type": "4",
"sid_ztk": "16",
"customer_id_ztk": "100000",
"platform_ztk": "zhetaoke",
"actId": "10144",
"san_pingtai": "饿了么",
"san_pingtai_id": "8"
}
]
}"#;
let response: ElemeOrderResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.status, Some(200));
assert!(response.content.is_some());
let orders = response.content.unwrap();
assert_eq!(orders.len(), 1);
assert_eq!(orders[0].orderid, Some("105518514197820013".to_string()));
assert_eq!(orders[0].profit, Some(1.29));
assert_eq!(orders[0].san_pingtai_id, Some("8".to_string()));
}
#[test]
fn test_eleme_convert_response_with_missing_fields() {
let json = r#"{
"alibaba_alsc_union_eleme_promotion_officialactivity_get_response": {
"message": "success",
"result_code": 0
}
}"#;
let response: ElemeConvertResponse = serde_json::from_str(json).unwrap();
assert!(response.response.is_some());
let inner = response.response.unwrap();
assert!(inner.data.is_none());
}
#[test]
fn test_eleme_order_response_empty_content() {
let json = r#"{"status": 200, "content": []}"#;
let response: ElemeOrderResponse = serde_json::from_str(json).unwrap();
assert_eq!(response.status, Some(200));
assert!(response.content.is_some());
assert_eq!(response.content.unwrap().len(), 0);
}
#[test]
fn test_eleme_order_info_optional_fields() {
let json = r#"{
"orderid": "123456",
"status": "1",
"san_pingtai_id": "8"
}"#;
let order: ElemeOrderInfo = serde_json::from_str(json).unwrap();
assert_eq!(order.orderid, Some("123456".to_string()));
assert_eq!(order.status, Some("1".to_string()));
assert_eq!(order.san_pingtai_id, Some("8".to_string()));
assert!(order.profit.is_none());
assert!(order.act_id.is_none());
}
}