use serde::Deserialize;
use crate::client::WeChatClient;
use crate::error::Result;
use crate::models::menu::{ConditionalMenu, GetMenuResponse, MatchRule, Menu, MenuButton};
#[derive(Deserialize)]
#[allow(dead_code)]
struct ApiResponse {
errcode: Option<i64>,
errmsg: Option<String>,
}
#[derive(Deserialize)]
struct CreateConditionalMenuResponse {
menuid: Option<i64>,
}
impl WeChatClient {
pub async fn create_menu(&self, buttons: Vec<MenuButton>) -> Result<()> {
let menu = Menu { button: buttons };
let _: ApiResponse = self.post_json("/menu/create", &menu).await?;
Ok(())
}
pub async fn get_menu(&self) -> Result<GetMenuResponse> {
self.get("/get_current_selfmenu_info", &[]).await
}
pub async fn delete_menu(&self) -> Result<()> {
let _: ApiResponse = self.get("/menu/delete", &[]).await?;
Ok(())
}
pub async fn create_conditional_menu(
&self,
buttons: Vec<MenuButton>,
match_rule: MatchRule,
) -> Result<i64> {
let menu = ConditionalMenu {
button: buttons,
matchrule: match_rule,
menuid: None,
};
let resp: CreateConditionalMenuResponse =
self.post_json("/menu/addconditional", &menu).await?;
Ok(resp.menuid.unwrap_or(0))
}
pub async fn delete_conditional_menu(&self, menu_id: i64) -> Result<()> {
let body = serde_json::json!({
"menuid": menu_id
});
let _: ApiResponse = self.post_json("/menu/delconditional", &body).await?;
Ok(())
}
pub async fn try_match_menu(&self, user_id: &str) -> Result<Menu> {
let body = serde_json::json!({
"user_id": user_id
});
self.post_json("/menu/trymatch", &body).await
}
}