slack_rust/block/
blocks.rs

1//! Blocks are a series of components that can be combined to create visually rich and compellingly interactive messages.    
2//! See: <https://api.slack.com/reference/block-kit/blocks>
3
4use 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/// Blocks are a series of components that can be combined to create visually rich and compellingly interactive messages.
17/// See: <https://api.slack.com/reference/block-kit/blocks>
18#[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}