use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactCreateUserEvent {
#[serde(rename="ToUserName")]
pub target: String,
#[serde(rename="FromUserName")]
pub source: String,
#[serde(rename="Name")]
pub name: Option<String>,
#[serde(rename="Telephone")]
pub telephone: Option<String>,
#[serde(rename="Address")]
pub address: Option<String>,
#[serde(rename="Alias")]
pub alias: Option<String>,
#[serde(rename="CreateTime")]
pub create_time: i64,
#[serde(rename="UserID")]
pub user_id: String,
#[serde(rename="Position")]
pub position: Option<String>,
#[serde(rename="Avatar")]
pub avatar: Option<String>,
#[serde(rename="MainDepartment")]
pub main_department: i64,
#[serde(rename="Status")]
pub status: i64,
#[serde(rename="Gender")]
pub gender: Option<i64>,
#[serde(rename="Department")]
pub department: String,
#[serde(rename="IsLeaderInDept")]
pub is_leader_in_dept: Option<String>,
#[serde(rename="DirectLeader")]
pub direct_leader: Option<Vec<String>>,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="Mobile")]
pub mobile: Option<String>,
#[serde(rename="Email")]
pub email: String,
#[serde(rename="BizMail")]
pub biz_mail: Option<String>,
#[serde(rename="ExtAttr")]
pub ext_attrs: Option<ExtAttrs>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpExtAttrItemText {
#[serde(rename = "Value")]
pub value: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpExtAttrItemWeb {
#[serde(rename="Title")]
pub title: String,
#[serde(rename="Url")]
pub url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactUpdateUserEvent {
#[serde(rename="ToUserName")]
pub target: String,
#[serde(rename="FromUserName")]
pub source: String,
#[serde(rename="CreateTime")]
pub create_time: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="MsgType")]
pub msg_type: String,
#[serde(rename="UserID")]
pub user_id: String,
#[serde(rename="NewUserID")]
pub new_user_id: String,
#[serde(rename="Name")]
pub name: Option<String>,
#[serde(rename="Department")]
pub department: String,
#[serde(rename="MainDepartment")]
pub main_department: i64,
#[serde(rename="IsLeaderInDept")]
pub is_leader_in_dept: Option<String>,
#[serde(rename="Position")]
pub position: Option<String>,
#[serde(rename="Mobile")]
pub mobile: Option<String>,
#[serde(rename="Gender")]
pub gender: Option<i64>,
#[serde(rename="Email")]
pub email: String,
#[serde(rename="Status")]
pub status: i64,
#[serde(rename="Avatar")]
pub avatar: Option<String>,
#[serde(rename="Alias")]
pub alias: Option<String>,
#[serde(rename="Telephone")]
pub telephone: Option<String>,
#[serde(rename="Address")]
pub address: Option<String>,
#[serde(rename="DirectLeader")]
pub direct_leader: Option<String>,
#[serde(rename="BizMail")]
pub biz_mail: Option<String>,
#[serde(rename="ExtAttr")]
pub ext_attrs: Option<ExtAttrs>,
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct ExtAttrs {
#[serde(rename = "Item")]
items: Vec<ExtAttrItem>
}
#[derive(Debug, Serialize, Deserialize,Clone)]
pub struct ExtAttrItem {
#[serde(rename = "Name")]
name: String,
#[serde(rename = "Type")]
attr_type: u32,
#[serde(rename="Text")]
pub text: Option<CpExtAttrItemText>,
#[serde(rename="Web")]
pub web: Option<CpExtAttrItemWeb>,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactDeleteUserEvent {
#[serde(rename = "ToUserName")]
pub target: String,
#[serde(rename = "FromUserName")]
pub source: String,
# [serde(rename = "CreateTime")]
pub create_time: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="MsgType")]
pub msg_type: String,
#[serde(rename="UserID")]
pub user_id: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactCreatePartyEvent {
#[serde(rename = "ToUserName")]
pub target: String,
#[serde(rename = "FromUserName")]
pub source: String,
# [serde(rename = "CreateTime")]
pub create_time: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="MsgType")]
pub msg_type: String,
#[serde(rename="Id")]
pub id: i32,
#[serde(rename="ParentId")]
pub parent_id: i32,
#[serde(rename="Name")]
pub name: String,
#[serde(rename="Order")]
pub order: i32,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactUpdatePartyEvent {
#[serde(rename = "ToUserName")]
pub target: String,
#[serde(rename = "FromUserName")]
pub source: String,
# [serde(rename = "CreateTime")]
pub create_time: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="MsgType")]
pub msg_type: String,
#[serde(rename="Id")]
pub id: i32,
#[serde(rename="ParentId")]
pub parent_id: i32,
#[serde(rename="Name")]
pub name: String,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactDeletePartyEvent {
#[serde(rename = "ToUserName")]
pub target: String,
#[serde(rename = "FromUserName")]
pub source: String,
# [serde(rename = "CreateTime")]
pub create_time: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="MsgType")]
pub msg_type: String,
#[serde(rename="Id")]
pub id: i32,
}
#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct CpContactUpdateTagEvent {
#[serde(rename = "ToUserName")]
pub target: String,
#[serde(rename = "FromUserName")]
pub source: String,
# [serde(rename = "CreateTime")]
pub create_time: i64,
#[serde(rename="Event")]
pub event: String,
#[serde(rename="ChangeType")]
pub change_type: String,
#[serde(rename="MsgType")]
pub msg_type: String,
#[serde(rename="TagId")]
pub tag_id: i32,
#[serde(rename="AddUserItems")]
pub add_users: Option<String>,
#[serde(rename="DelUserItems")]
pub delete_users: Option<String>,
#[serde(rename="AddPartyItems")]
pub add_party: Option<String>,
#[serde(rename="DelPartyItems")]
pub delete_party: Option<String>,
}
#[cfg(test)]
mod tests {
use crate::{CpContactUpdateUserEvent, XmlMessageParser};
use super::CpContactCreateUserEvent;
#[test]
fn test_create_user_from_xml() {
let xml = "<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[sys]]></FromUserName>
<CreateTime>1403610513</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[change_contact]]></Event>
<ChangeType>create_user</ChangeType>
<UserID><![CDATA[zhangsan]]></UserID>
<Name><![CDATA[张三]]></Name>
<Department><![CDATA[1,2,3]]></Department>
<MainDepartment>1</MainDepartment>
<IsLeaderInDept><![CDATA[1,0,0]]></IsLeaderInDept>
<DirectLeader><![CDATA[lisi,wangwu]]></DirectLeader>
<Position><![CDATA[产品经理]]></Position>
<Mobile>13800000000</Mobile>
<Gender>1</Gender>
<Email><![CDATA[zhangsan@gzdev.com]]></Email>
<BizMail><![CDATA[zhangsan@qyycs2.wecom.work]]></BizMail>
<Status>1</Status>
<Avatar><![CDATA[http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0]]></Avatar>
<Alias><![CDATA[zhangsan]]></Alias>
<Telephone><![CDATA[020-123456]]></Telephone>
<Address><![CDATA[广州市]]></Address>
</xml>";
let item: CpContactCreateUserEvent = CpContactCreateUserEvent::from_xml(xml).unwrap();
println!("{}", serde_json::to_string(&item).unwrap_or_default());
}
#[test]
fn test_update_user_from_xml() {
let xml = "<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[sys]]></FromUserName>
<CreateTime>1403610513</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[change_contact]]></Event>
<ChangeType>update_user</ChangeType>
<UserID><![CDATA[zhangsan]]></UserID>
<NewUserID><![CDATA[zhangsan001]]></NewUserID>
<Name><![CDATA[张三]]></Name>
<Department><![CDATA[1,2,3]]></Department>
<MainDepartment>1</MainDepartment>
<IsLeaderInDept><![CDATA[1,0,0]]></IsLeaderInDept>
<Position><![CDATA[产品经理]]></Position>
<Mobile>13800000000</Mobile>
<Gender>1</Gender>
<Email><![CDATA[zhangsan@gzdev.com]]></Email>
<Status>1</Status>
<Avatar><![CDATA[http://wx.qlogo.cn/mmopen/ajNVdqHZLLA3WJ6DSZUfiakYe37PKnQhBIeOQBO4czqrnZDS79FH5Wm5m4X69TBicnHFlhiafvDwklOpZeXYQQ2icg/0]]></Avatar>
<Alias><![CDATA[zhangsan]]></Alias>
<Telephone><![CDATA[020-123456]]></Telephone>
<Address><![CDATA[广州市]]></Address>
<ExtAttr>
<Item>
<Name><![CDATA[爱好]]></Name>
<Type>0</Type>
<Text>
<Value><![CDATA[旅游]]></Value>
</Text>
</Item>
<Item>
<Name><![CDATA[卡号]]></Name>
<Type>1</Type>
<Web>
<Title><![CDATA[企业微信]]></Title>
<Url><![CDATA[https://work.weixin.qq.com]]></Url>
</Web>
</Item>
</ExtAttr>
</xml>";
let item: CpContactUpdateUserEvent = CpContactUpdateUserEvent::from_xml(xml).unwrap();
println!("{}", serde_json::to_string(&item).unwrap_or_default());
}
}