use crate::{current_timestamp, QuoteArea, ReplyRenderer};
#[derive(Debug, Clone)]
pub struct CpTemplateCardTextReply {
pub source: String,
pub target: String,
pub time: i64,
pub card_type: String,
pub card_source: TemplateCardSource,
pub main_title: TemplateCardContent,
pub sub_title: Option<String>,
pub horizontal_content: Vec<HorizontalContentList>,
pub jump_list: JumpList,
pub card_action: CardAction,
pub emphasis_content: TemplateCardContent,
pub action_menu: ActionMenu,
pub quote_area: QuoteArea,
}
#[derive(Debug, Clone)]
pub struct ActionMenu {
pub desc: Option<String>,
pub action_list: Vec<ActionListItem>,
}
#[derive(Debug, Clone)]
pub struct ActionListItem {
pub text: Option<String>,
pub key: Option<String>,
}
#[derive(Debug, Clone)]
pub struct HorizontalContentList {
pub key_name: String,
pub value: Option<String>,
pub url: Option<String>,
pub media_id: Option<String>,
pub user_id: Option<String>,
pub url_type: Option<u8>,
}
#[derive(Debug, Clone)]
pub struct CardAction {
pub title: Option<String>,
pub action_type: Option<u8>,
pub url: Option<String>,
pub page_path: Option<String>,
pub app_id: Option<String>,
}
#[derive(Debug, Clone)]
pub struct JumpList {
pub title: String,
pub jump_type: Option<u8>,
pub url: Option<String>,
pub page_path: Option<String>,
pub app_id: Option<String>,
}
#[derive(Debug, Clone)]
pub struct TemplateCardContent {
pub title: Option<String>,
pub desc: Option<String>,
}
#[derive(Debug, Clone)]
pub struct TemplateCardSource {
pub icon_url: String,
pub desc: String,
pub desc_color: i64,
}
#[allow(unused)]
impl CpTemplateCardTextReply {
#[inline]
pub fn new<S: Into<String>>(source: S, target: S) -> CpTemplateCardTextReply {
CpTemplateCardTextReply {
source: source.into(),
target: target.into(),
time: current_timestamp(),
card_type: "".to_string(),
card_source: TemplateCardSource {
icon_url: "".to_string(),
desc: "".to_string(),
desc_color: 0
},
main_title: TemplateCardContent { title: None, desc: None },
sub_title: None,
horizontal_content: vec![],
jump_list: JumpList{
title: "".to_string(),
jump_type: None,
url: None,
page_path: None,
app_id: None
},
card_action: CardAction {
title: None,
action_type: None,
url: None,
page_path: None,
app_id: None
},
emphasis_content: TemplateCardContent{ title: None, desc: None },
action_menu: ActionMenu { desc: None, action_list: vec![] },
quote_area: QuoteArea {
r#type: None,
url: None,
appid: None,
pagepath: None,
title: None,
quote_text: None
}
}
}
}
impl ReplyRenderer for CpTemplateCardTextReply {
#[inline]
fn render(&self) -> String {
let mut horizontal_content = String::default();
for content in &self.horizontal_content {
let mut xml = format!("<HorizontalContentList>
<KeyName><![CDATA[{}]]></KeyName>
<Type>{}</Type>
<Value><![CDATA[{}]]></Value>", content.key_name, content.url_type.to_owned().unwrap_or_default(),content.value.to_owned().unwrap_or_default());
if let Some(url) = &content.url {
xml.push_str(&format!("<Url><![CDATA[{}]]></Url>", url))
}
if let Some(user_id) = &content.user_id {
xml.push_str(&format!("<UserId><![CDATA[{}]]></UserId>", user_id))
}
if let Some(media_id) = &content.media_id {
xml.push_str(&format!("<MediaId><![CDATA[{}]]></MediaId>", media_id))
}
xml.push_str("</HorizontalContentList>\n");
horizontal_content.push_str(&xml);
}
let mut action_list = String::default();
for item in &self.action_menu.action_list {
let xml = format!("<ActionList>
<Text><![CDATA[{}]]></Text>
<Key>{}</Key></ActionList>", item.text.to_owned().unwrap_or_default(),item.key.to_owned().unwrap_or_default());
action_list.push_str(&xml);
}
format!("<xml>\n\
<ToUserName><![CDATA[{target}]]></ToUserName>\n\
<FromUserName><![CDATA[{source}]]></FromUserName>\n\
<CreateTime>{time}</CreateTime>\n\
<MsgType><![CDATA[update_template_card]]></MsgType>\n\
<TemplateCard>\n\
<CardType><![CDATA[{card_type}]]></CardType>\n\
<Source>\n\
<IconUrl><![CDATA[{icon_url}]]></IconUrl>\n\
<Desc><![CDATA[{source_desc}]]></Desc>\n\
<DescColor>{source_desc_color}</DescColor>\n\
</Source>\n\
<MainTitle>
<Title><![CDATA[{main_title}]]></Title>
<Desc><![CDATA[{main_title_desc}]]></Desc>
</MainTitle>
<SubTitleText><![CDATA[{sub_title}]]></SubTitleText>
{horizontal_content}
<JumpList>
<Title><![CDATA[{jump_title}]]></Title>
<Type>{jump_type}</Type>
<Url><![CDATA[{jump_url}]]></Url>
</JumpList>
<CardAction>
<Title><![CDATA[{action_title}]]></Title>
<Type>{action_type}</Type>
<Url><![CDATA[{action_url}]]></Url>
</CardAction>
<EmphasisContent>
<Title><![CDATA[{emphasis_title}]]></Title>
<Desc><![CDATA[{emphasis_desc}]]></Desc>
</EmphasisContent>
<ActionMenu>
<Desc><![CDATA[{action_menu_desc}]]></Desc>
{action_list}
</ActionMenu>
<QuoteArea>
<Type><![CDATA[{quote_type}]]></Type>
<Url><![CDATA[{quote_url}]]></Url>
<Title><![CDATA[{quote_title}]]></Title>
<QuoteText><![CDATA[{quote_text}]]></QuoteText>
</QuoteArea>
</TemplateCard>\n\
</xml>",
target=self.target,
source=self.source,
time=self.time,
card_type=self.card_type,
icon_url=self.card_source.icon_url,
source_desc=self.card_source.desc,
source_desc_color=self.card_source.desc_color,
main_title=self.main_title.title.to_owned().unwrap_or_default(),
main_title_desc=self.main_title.desc.to_owned().unwrap_or_default(),
sub_title=self.sub_title.to_owned().unwrap_or_default(),
horizontal_content=horizontal_content,
action_list=action_list,
jump_title=self.jump_list.title,
jump_type=self.jump_list.jump_type.to_owned().unwrap_or_default(),
jump_url=self.jump_list.url.to_owned().unwrap_or_default(),
action_title=self.card_action.title.to_owned().unwrap_or_default(),
action_type=self.card_action.action_type.to_owned().unwrap_or_default(),
action_url=self.card_action.url.to_owned().unwrap_or_default(),
emphasis_title=self.emphasis_content.title.to_owned().unwrap_or_default(),
emphasis_desc=self.emphasis_content.desc.to_owned().unwrap_or_default(),
quote_type=self.quote_area.r#type.to_owned().unwrap_or_default(),
quote_url=self.quote_area.url.to_owned().unwrap_or_default(),
quote_title=self.quote_area.title.to_owned().unwrap_or_default(),
quote_text=self.quote_area.quote_text.to_owned().unwrap_or_default(),
action_menu_desc=self.action_menu.desc.to_owned().unwrap_or_default(),
)
}
}