use serde::{Deserialize, Serialize};
use crate::card::{
components::{
content_components::plain_text::PlainText, interactive_components::input::InputConfirm,
},
icon::FeishuCardTextIcon,
};
#[derive(Debug, Serialize, Deserialize)]
pub struct SelectStatic {
tag: String,
#[serde(skip_serializing_if = "Option::is_none")]
r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
disabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
initial_index: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
placeholder: Option<PlainText>,
#[serde(skip_serializing_if = "Option::is_none")]
width: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
options: Option<Vec<SelectStaticOption>>,
#[serde(skip_serializing_if = "Option::is_none")]
confirm: Option<InputConfirm>,
}
impl Default for SelectStatic {
fn default() -> Self {
Self {
tag: "select_static".to_string(),
r#type: None,
name: None,
required: None,
disabled: None,
initial_index: None,
placeholder: None,
width: None,
options: None,
confirm: None,
}
}
}
impl SelectStatic {
pub fn new() -> Self {
Self::default()
}
pub fn r#type(mut self, r#type: &str) -> Self {
self.r#type = Some(r#type.to_string());
self
}
pub fn name(mut self, name: &str) -> Self {
self.name = Some(name.to_string());
self
}
pub fn required(mut self, required: bool) -> Self {
self.required = Some(required);
self
}
pub fn disabled(mut self, disabled: bool) -> Self {
self.disabled = Some(disabled);
self
}
pub fn initial_index(mut self, initial_index: u32) -> Self {
self.initial_index = Some(initial_index);
self
}
pub fn placeholder(mut self, placeholder: PlainText) -> Self {
self.placeholder = Some(placeholder);
self
}
pub fn width(mut self, width: &str) -> Self {
self.width = Some(width.to_string());
self
}
pub fn options(mut self, options: Vec<SelectStaticOption>) -> Self {
self.options = Some(options);
self
}
pub fn confirm(mut self, confirm: InputConfirm) -> Self {
self.confirm = Some(confirm);
self
}
}
#[derive(Debug, Serialize, Deserialize, Default)]
pub struct SelectStaticOption {
text: PlainText,
#[serde(skip_serializing_if = "Option::is_none")]
icon: Option<FeishuCardTextIcon>,
value: String,
}
impl SelectStaticOption {
pub fn new(text: &str, value: &str) -> Self {
Self {
text: PlainText::text(text),
icon: None,
value: value.to_string(),
}
}
pub fn text(mut self, text: PlainText) -> Self {
self.text = text;
self
}
pub fn icon(mut self, icon: FeishuCardTextIcon) -> Self {
self.icon = Some(icon);
self
}
pub fn value(mut self, value: &str) -> Self {
self.value = value.to_string();
self
}
}
#[cfg(test)]
mod test {
use serde_json::json;
use crate::card::{
components::{
content_components::plain_text::PlainText,
interactive_components::{
input::InputConfirm,
select_static::{SelectStatic, SelectStaticOption},
},
},
icon::FeishuCardTextIcon,
};
#[test]
fn test_select_static() {
let select_static = SelectStatic::new()
.r#type("text")
.name("select_static1")
.required(false)
.disabled(false)
.initial_index(1)
.placeholder(PlainText::text("默认提示文本"))
.width("default")
.options(vec![SelectStaticOption::new("我是交互组件", "selectDemo1")
.icon(
FeishuCardTextIcon::new()
.token("chat-forbidden_outlined")
.color("orange")
.img_key("img_v2_38811724"),
)])
.confirm(InputConfirm::new("弹窗标题", "弹窗正文文案"));
let json = json!({
"tag": "select_static", "type": "text", "name": "select_static1", "required": false, "disabled": false, "initial_index": 1, "placeholder": {
"tag": "plain_text",
"content": "默认提示文本"
},
"width": "default", "options": [
{
"text": {
"tag": "plain_text",
"content": "我是交互组件"
},
"icon": {
"tag": "standard_icon", "token": "chat-forbidden_outlined", "color": "orange", "img_key": "img_v2_38811724" },
"value": "selectDemo1" }
],
"confirm": {
"title": {
"tag": "plain_text",
"content": "弹窗标题"
},
"text": {
"tag": "plain_text",
"content": "弹窗正文文案"
}
}
});
assert_eq!(serde_json::to_value(&select_static).unwrap(), json);
}
}