use serde::{Serialize, Deserialize};
use serde_json::Value;
use crate::{session::SessionStore, request::{RequestType}, WechatCommonResponse, LabradorResult, WechatCpClient};
use crate::wechat::cp::method::{CpMenuMethod, WechatCpMethod};
#[derive(Debug, Clone)]
pub struct WechatCpMenu<'a, T: SessionStore> {
client: &'a WechatCpClient<T>,
}
#[allow(unused)]
impl<'a, T: SessionStore> WechatCpMenu<'a, T> {
#[inline]
pub fn new(client: &WechatCpClient<T>) -> WechatCpMenu<T> {
WechatCpMenu {
client,
}
}
pub async fn create(&self, menu: WechatCpMenuInfo) -> LabradorResult<WechatCommonResponse> {
self.create_with_agentid(self.client.agent_id.to_owned().unwrap_or_default(), menu).await
}
pub async fn create_with_agentid(&self, agent_id: i32, req: WechatCpMenuInfo) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatCpMethod::Menu(CpMenuMethod::Create(agent_id)), vec![], req, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn delete(&self) -> LabradorResult<WechatCommonResponse> {
self.delete_with_agentid(self.client.agent_id.to_owned().unwrap_or_default()).await
}
pub async fn delete_with_agentid(&self, agent_id: i32) -> LabradorResult<WechatCommonResponse> {
self.client.post(WechatCpMethod::Menu(CpMenuMethod::Delete(agent_id)), vec![], Value::Null, RequestType::Json).await?.json::<WechatCommonResponse>()
}
pub async fn get(&self) -> LabradorResult<WechatCommonResponse> {
self.delete_with_agentid(self.client.agent_id.to_owned().unwrap_or_default()).await
}
pub async fn get_with_agentid(&self, agent_id: i32) -> LabradorResult<WechatCpMenuInfo> {
let v = self.client.post(WechatCpMethod::Menu(CpMenuMethod::Get(agent_id)), vec![], Value::Null, RequestType::Json).await?.json::<Value>()?;
WechatCommonResponse::parse::<WechatCpMenuInfo>(v)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpMenuInfo {
pub buttons: Vec<WechatCpMenuButton>,
pub match_rule: Option<WechatCpMenuRule>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpMenuButton {
#[serde(rename="type")]
pub r#type: String,
pub name: String,
pub key: Option<String>,
pub url: Option<String>,
pub media_id: Option<String>,
pub article_id: Option<String>,
pub appid: Option<String>,
pub pagepath: Option<String>,
pub sub_button: Vec<WechatCpMenuButton>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WechatCpMenuRule {
pub tag_id: Option<String>,
pub sex: Option<String>,
pub province: Option<String>,
pub city: Option<String>,
pub client_platform_type: Option<String>,
pub language: Option<String>,
}