use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct VipConvertRequest {
pub sid: String,
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "chanTag")]
pub chan_tag: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "statParam")]
pub stat_param: Option<String>,
}
impl VipConvertRequest {
pub fn new(sid: impl Into<String>, url: impl Into<String>) -> Self {
Self {
sid: sid.into(),
url: url.into(),
chan_tag: None,
stat_param: None,
}
}
pub fn chan_tag(mut self, chan_tag: impl Into<String>) -> Self {
self.chan_tag = Some(chan_tag.into());
self
}
pub fn stat_param(mut self, stat_param: impl Into<String>) -> Self {
self.stat_param = Some(stat_param.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct VipAuthorizeRequest {
pub backurl: String,
}
impl VipAuthorizeRequest {
pub fn new(backurl: impl Into<String>) -> Self {
Self {
backurl: backurl.into(),
}
}
}
#[derive(Debug, Clone, Serialize)]
pub struct VipOrderQueryRequest {
pub sid: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "orderTimeStart")]
pub order_time_start: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "orderTimeEnd")]
pub order_time_end: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "updateTimeStart")]
pub update_time_start: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "updateTimeEnd")]
pub update_time_end: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "pageSize")]
pub page_size: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "orderSnList")]
pub order_sn_list: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "chanTag")]
pub chan_tag: Option<String>,
}
impl VipOrderQueryRequest {
pub fn new(sid: impl Into<String>) -> Self {
Self {
sid: sid.into(),
status: None,
order_time_start: None,
order_time_end: None,
update_time_start: None,
update_time_end: None,
page: None,
page_size: None,
order_sn_list: None,
chan_tag: None,
}
}
pub fn status(mut self, status: u32) -> Self {
self.status = Some(status);
self
}
pub fn order_time_range(mut self, start: i64, end: i64) -> Self {
self.order_time_start = Some(start);
self.order_time_end = Some(end);
self
}
pub fn update_time_range(mut self, start: i64, end: i64) -> Self {
self.update_time_start = Some(start);
self.update_time_end = Some(end);
self
}
pub fn page(mut self, page: u32) -> Self {
self.page = Some(page);
self
}
pub fn page_size(mut self, page_size: u32) -> Self {
self.page_size = Some(page_size);
self
}
pub fn order_sn_list(mut self, order_sn_list: impl Into<String>) -> Self {
self.order_sn_list = Some(order_sn_list.into());
self
}
pub fn chan_tag(mut self, chan_tag: impl Into<String>) -> Self {
self.chan_tag = Some(chan_tag.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct VipGoodsDetailRequest {
pub sid: String,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "queryDetail")]
pub query_detail: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "queryStock")]
pub query_stock: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "queryReputation")]
pub query_reputation: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "queryStoreServiceCapability")]
pub query_store_service_capability: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "queryPMSAct")]
pub query_pms_act: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "extendBySpu")]
pub extend_by_spu: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "queryExclusiveCoupon")]
pub query_exclusive_coupon: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "extendSku")]
pub extend_sku: Option<bool>,
}
impl VipGoodsDetailRequest {
pub fn new(sid: impl Into<String>, id: impl Into<String>) -> Self {
Self {
sid: sid.into(),
id: id.into(),
query_detail: None,
query_stock: None,
query_reputation: None,
query_store_service_capability: None,
query_pms_act: None,
extend_by_spu: None,
query_exclusive_coupon: None,
extend_sku: None,
}
}
pub fn query_detail(mut self, query_detail: bool) -> Self {
self.query_detail = Some(query_detail);
self
}
pub fn query_stock(mut self, query_stock: bool) -> Self {
self.query_stock = Some(query_stock);
self
}
pub fn query_reputation(mut self, query_reputation: bool) -> Self {
self.query_reputation = Some(query_reputation);
self
}
pub fn query_store_service_capability(mut self, query: bool) -> Self {
self.query_store_service_capability = Some(query);
self
}
pub fn query_pms_act(mut self, query_pms_act: bool) -> Self {
self.query_pms_act = Some(query_pms_act);
self
}
pub fn extend_by_spu(mut self, extend_by_spu: bool) -> Self {
self.extend_by_spu = Some(extend_by_spu);
self
}
pub fn query_exclusive_coupon(mut self, query: bool) -> Self {
self.query_exclusive_coupon = Some(query);
self
}
pub fn extend_sku(mut self, extend_sku: bool) -> Self {
self.extend_sku = Some(extend_sku);
self
}
}
#[derive(Debug, Clone, Serialize)]
pub struct VipSearchGoodsRequest {
pub sid: String,
pub keyword: String,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "fieldName")]
pub field_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub order: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "pageSize")]
pub page_size: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "priceStart")]
pub price_start: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(rename = "priceEnd")]
pub price_end: Option<String>,
}
impl VipSearchGoodsRequest {
pub fn new(sid: impl Into<String>, keyword: impl Into<String>) -> Self {
Self {
sid: sid.into(),
keyword: keyword.into(),
field_name: None,
order: None,
page: None,
page_size: None,
price_start: None,
price_end: None,
}
}
pub fn field_name(mut self, field_name: impl Into<String>) -> Self {
self.field_name = Some(field_name.into());
self
}
pub fn order(mut self, order: u32) -> Self {
self.order = Some(order);
self
}
pub fn page(mut self, page: u32) -> Self {
self.page = Some(page);
self
}
pub fn page_size(mut self, page_size: u32) -> Self {
self.page_size = Some(page_size);
self
}
pub fn price_range(mut self, start: impl Into<String>, end: impl Into<String>) -> Self {
self.price_start = Some(start.into());
self.price_end = Some(end.into());
self
}
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct VipAuthorizeListRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expire_day: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sid: Option<String>,
}
impl VipAuthorizeListRequest {
pub fn new() -> Self {
Self::default()
}
pub fn page(mut self, page: u32) -> Self {
self.page = Some(page);
self
}
pub fn expire_day(mut self, expire_day: u32) -> Self {
self.expire_day = Some(expire_day);
self
}
pub fn sid(mut self, sid: impl Into<String>) -> Self {
self.sid = Some(sid.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vip_convert_request_serialize() {
let request = VipConvertRequest::new("sid123", "6919173790682972930");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["sid"], "sid123");
assert_eq!(json["url"], "6919173790682972930");
assert!(json.get("chanTag").is_none());
}
#[test]
fn test_vip_convert_request_with_options() {
let request = VipConvertRequest::new("sid123", "6919173790682972930")
.chan_tag("pid123")
.stat_param("custom_param");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["chanTag"], "pid123");
assert_eq!(json["statParam"], "custom_param");
}
#[test]
fn test_vip_authorize_request_serialize() {
let request = VipAuthorizeRequest::new("https://www.example.com/callback");
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["backurl"], "https://www.example.com/callback");
}
#[test]
fn test_vip_order_query_request_serialize() {
let request = VipOrderQueryRequest::new("sid123")
.page(1)
.page_size(20)
.status(2);
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["sid"], "sid123");
assert_eq!(json["page"], 1);
assert_eq!(json["pageSize"], 20);
assert_eq!(json["status"], 2);
}
#[test]
fn test_vip_goods_detail_request_serialize() {
let request = VipGoodsDetailRequest::new("sid123", "6919173790682972930")
.query_detail(true)
.extend_sku(true);
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["sid"], "sid123");
assert_eq!(json["id"], "6919173790682972930");
assert_eq!(json["queryDetail"], true);
assert_eq!(json["extendSku"], true);
}
#[test]
fn test_vip_search_goods_request_serialize() {
let request = VipSearchGoodsRequest::new("sid123", "球鞋")
.page(1)
.page_size(20)
.field_name("PRICE")
.order(0);
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["sid"], "sid123");
assert_eq!(json["keyword"], "球鞋");
assert_eq!(json["page"], 1);
assert_eq!(json["pageSize"], 20);
assert_eq!(json["fieldName"], "PRICE");
assert_eq!(json["order"], 0);
}
#[test]
fn test_vip_authorize_list_request_serialize() {
let request = VipAuthorizeListRequest::new().page(1).expire_day(3);
let json = serde_json::to_value(&request).unwrap();
assert_eq!(json["page"], 1);
assert_eq!(json["expire_day"], 3);
}
#[test]
fn test_optional_fields_not_serialized() {
let request = VipConvertRequest::new("sid", "url");
let json_str = serde_json::to_string(&request).unwrap();
assert!(!json_str.contains("chanTag"));
assert!(!json_str.contains("statParam"));
}
}