slack_rust/block/
blocks.rs1use crate::block::block_actions::ActionBlock;
5use crate::block::block_context::ContextBlock;
6use crate::block::block_divider::DividerBlock;
7use crate::block::block_file::FileBlock;
8use crate::block::block_header::HeaderBlock;
9use crate::block::block_image::ImageBlock;
10use crate::block::block_input::InputBlock;
11use crate::block::block_object::{OptionBlockObject, TextBlockObject};
12use crate::block::block_section::SectionBlock;
13use serde::{Deserialize, Serialize};
14use serde_with::skip_serializing_none;
15
16#[derive(Deserialize, Serialize, Debug, PartialEq)]
19#[serde(tag = "type")]
20pub enum Block {
21 #[serde(rename = "actions")]
22 ActionBlock(ActionBlock),
23 #[serde(rename = "context")]
24 ContextBlock(ContextBlock),
25 #[serde(rename = "divider")]
26 DividerBlock(DividerBlock),
27 #[serde(rename = "file")]
28 FileBlock(FileBlock),
29 #[serde(rename = "header")]
30 HeaderBlock(HeaderBlock),
31 #[serde(rename = "image")]
32 ImageBlock(ImageBlock),
33 #[serde(rename = "input")]
34 InputBlock(InputBlock),
35 #[serde(rename = "section")]
36 SectionBlock(SectionBlock),
37 #[serde(skip)]
38 None,
39}
40
41impl Block {
42 pub fn block_type(&self) -> BlockType {
43 match self {
44 Block::ActionBlock(ActionBlock { .. }) => BlockType::Actions,
45 Block::ContextBlock(ContextBlock { .. }) => BlockType::Context,
46 Block::DividerBlock(DividerBlock { .. }) => BlockType::Divider,
47 Block::FileBlock(FileBlock { .. }) => BlockType::File,
48 Block::HeaderBlock(HeaderBlock { .. }) => BlockType::Header,
49 Block::ImageBlock(ImageBlock { .. }) => BlockType::Image,
50 Block::InputBlock(InputBlock { .. }) => BlockType::Input,
51 Block::SectionBlock(SectionBlock { .. }) => BlockType::Section,
52 Block::None => BlockType::None,
53 }
54 }
55}
56
57impl Default for Block {
58 fn default() -> Self {
59 Block::None
60 }
61}
62
63#[derive(Deserialize, Serialize, Debug, PartialEq)]
64#[serde(rename_all = "snake_case")]
65pub enum BlockType {
66 Actions,
67 Context,
68 Divider,
69 File,
70 Header,
71 Image,
72 Input,
73 Section,
74 #[serde(skip)]
75 None,
76}
77
78impl Default for BlockType {
79 fn default() -> Self {
80 BlockType::None
81 }
82}
83
84#[skip_serializing_none]
85#[derive(Deserialize, Serialize, Debug, Default, PartialEq)]
86pub struct BlockAction {
87 #[serde(rename = "type")]
88 pub type_filed: String,
89 pub action_id: Option<String>,
90 pub block_id: Option<String>,
91 pub text: Option<TextBlockObject>,
92 pub value: Option<String>,
93 pub actions_ts: Option<String>,
94 pub selected_option: Option<OptionBlockObject>,
95 pub selected_options: Option<Vec<OptionBlockObject>>,
96 pub selected_user: Option<String>,
97 pub selected_users: Option<Vec<String>>,
98 pub selected_channel: Option<String>,
99 pub selected_channels: Option<Vec<String>>,
100 pub selected_conversation: Option<String>,
101 pub selected_conversations: Option<Vec<String>>,
102 pub selected_date: Option<String>,
103 pub selected_time: Option<String>,
104 pub initial_option: Option<OptionBlockObject>,
105 pub initial_user: Option<String>,
106 pub initial_channel: Option<String>,
107 pub initial_conversation: Option<String>,
108 pub initial_date: Option<String>,
109 pub initial_time: Option<String>,
110}