use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct KaolaConvertRequest {
pub sid: String,
#[serde(rename = "targetUrl")]
pub target_url: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "trackingCode2")]
pub tracking_code2: Option<String>,
}
impl KaolaConvertRequest {
pub fn new(sid: impl Into<String>, target_url: impl Into<String>) -> Self {
Self {
sid: sid.into(),
target_url: target_url.into(),
tracking_code2: None,
}
}
pub fn tracking_code2(mut self, tracking_code2: impl Into<String>) -> Self {
self.tracking_code2 = Some(tracking_code2.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct KaolaGoodsListRequest {
#[serde(rename = "poolName")]
pub pool_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "pageNo")]
pub page_no: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "pageSize")]
pub page_size: Option<u32>,
}
impl KaolaGoodsListRequest {
pub fn new(pool_name: impl Into<String>) -> Self {
Self {
pool_name: pool_name.into(),
page_no: None,
page_size: None,
}
}
pub fn page_no(mut self, page_no: u32) -> Self {
self.page_no = Some(page_no);
self
}
pub fn page_size(mut self, page_size: u32) -> Self {
self.page_size = Some(page_size);
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct KaolaSearchGoodsRequest {
#[serde(rename = "keyWord")]
pub keyword: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "type")]
pub sort_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub desc: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "pageNo")]
pub page_no: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "pageSize")]
pub page_size: Option<u32>,
}
impl KaolaSearchGoodsRequest {
pub fn new(keyword: impl Into<String>) -> Self {
Self {
keyword: keyword.into(),
sort_type: None,
desc: None,
page_no: None,
page_size: None,
}
}
pub fn sort_type(mut self, sort_type: impl Into<String>) -> Self {
self.sort_type = Some(sort_type.into());
self
}
pub fn desc(mut self, desc: bool) -> Self {
self.desc = Some(if desc {
"true".to_string()
} else {
"false".to_string()
});
self
}
pub fn page_no(mut self, page_no: u32) -> Self {
self.page_no = Some(page_no);
self
}
pub fn page_size(mut self, page_size: u32) -> Self {
self.page_size = Some(page_size);
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct KaolaGoodsDetailRequest {
#[serde(rename = "goodsIds")]
pub goods_ids: String,
}
impl KaolaGoodsDetailRequest {
pub fn new(goods_ids: impl Into<String>) -> Self {
Self {
goods_ids: goods_ids.into(),
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct KaolaOrderQueryRequest {
#[serde(rename = "type")]
pub query_type: String,
pub page: u32,
pub page_size: u32,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "startTime")]
pub start_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "endTime")]
pub end_time: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "orderSn")]
pub order_sn: Option<String>,
}
impl KaolaOrderQueryRequest {
pub fn new(query_type: impl Into<String>) -> Self {
Self {
query_type: query_type.into(),
page: 1,
page_size: 50,
start_time: None,
end_time: None,
order_sn: None,
}
}
pub fn page(mut self, page: u32) -> Self {
self.page = page;
self
}
pub fn page_size(mut self, page_size: u32) -> Self {
self.page_size = page_size;
self
}
pub fn start_time(mut self, start_time: impl Into<String>) -> Self {
self.start_time = Some(start_time.into());
self
}
pub fn end_time(mut self, end_time: impl Into<String>) -> Self {
self.end_time = Some(end_time.into());
self
}
pub fn order_sn(mut self, order_sn: impl Into<String>) -> Self {
self.order_sn = Some(order_sn.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_kaola_convert_request_serialize() {
let request = KaolaConvertRequest::new("sid123", "6919173790682972930");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["sid"], "sid123");
assert_eq!(json["targetUrl"], "6919173790682972930");
assert!(json.get("trackingCode2").is_none());
}
#[test]
fn test_kaola_convert_request_with_tracking_code() {
let request = KaolaConvertRequest::new("sid123", "http://lu.kaola.com/5DiMFU")
.tracking_code2("12345678901");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["sid"], "sid123");
assert_eq!(json["targetUrl"], "http://lu.kaola.com/5DiMFU");
assert_eq!(json["trackingCode2"], "12345678901");
}
#[test]
fn test_kaola_goods_list_request_serialize() {
let request = KaolaGoodsListRequest::new("1").page_no(1).page_size(20);
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["poolName"], "1");
assert_eq!(json["pageNo"], 1);
assert_eq!(json["pageSize"], 20);
}
#[test]
fn test_kaola_search_goods_request_serialize() {
let request = KaolaSearchGoodsRequest::new("球鞋")
.sort_type("2")
.desc(true)
.page_no(1)
.page_size(20);
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["keyWord"], "球鞋");
assert_eq!(json["type"], "2");
assert_eq!(json["desc"], "true");
assert_eq!(json["pageNo"], 1);
assert_eq!(json["pageSize"], 20);
}
#[test]
fn test_kaola_goods_detail_request_serialize() {
let request = KaolaGoodsDetailRequest::new("2480622");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["goodsIds"], "2480622");
}
#[test]
fn test_kaola_order_query_request_serialize() {
let request = KaolaOrderQueryRequest::new("1")
.page(1)
.page_size(50)
.start_time("2023-01-01 00:00:00")
.end_time("2023-01-31 23:59:59");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["type"], "1");
assert_eq!(json["page"], 1);
assert_eq!(json["page_size"], 50);
assert_eq!(json["startTime"], "2023-01-01 00:00:00");
assert_eq!(json["endTime"], "2023-01-31 23:59:59");
}
#[test]
fn test_kaola_order_query_request_by_order_sn() {
let request = KaolaOrderQueryRequest::new("3").order_sn("ORDER123456");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["type"], "3");
assert_eq!(json["orderSn"], "ORDER123456");
}
#[test]
fn test_optional_fields_not_serialized() {
let request = KaolaConvertRequest::new("sid", "url");
let json_str = serde_json::to_string(&request).unwrap();
assert!(!json_str.contains("trackingCode2"));
}
}