Skip to main content

slack_messaging/blocks/
mod.rs

1use serde::Serialize;
2
3/// Builders for blocks.
4pub mod builders;
5/// Objects from which blocks are composed.
6pub mod elements;
7/// Module for building [RichText] block.
8pub mod rich_text;
9/// Module for building [Table] block.
10pub mod table;
11/// Module for building [DataVisualization] block.
12pub mod data_visualization;
13/// Module for building [DataTable] block.
14pub mod data_table;
15
16mod actions;
17mod alert;
18mod card;
19mod carousel;
20mod container;
21mod context;
22mod context_actions;
23mod divider;
24mod file;
25mod header;
26mod image;
27mod input;
28mod markdown;
29mod plan;
30mod section;
31mod task_card;
32mod video;
33
34pub use actions::{Actions, ActionsElement};
35pub use alert::{Alert, AlertLevel};
36pub use card::Card;
37pub use carousel::Carousel;
38pub use container::{Container, ContainerChildBlock, ContainerWidth};
39pub use context::{Context, ContextElement};
40pub use context_actions::{ContextActions, ContextActionsElement};
41pub use data_table::DataTable;
42pub use data_visualization::DataVisualization;
43pub use divider::Divider;
44pub use file::{File, FileSource};
45pub use header::Header;
46pub use image::Image;
47pub use input::{Input, InputElement};
48pub use markdown::Markdown;
49pub use plan::Plan;
50pub use rich_text::RichText;
51pub use section::{Accessory, Section};
52pub use table::Table;
53pub use task_card::{TaskCard, TaskStatus};
54pub use video::Video;
55
56/// Objects that can be set to blocks in [Message](crate::message::Message).
57#[derive(Debug, Clone, Serialize, PartialEq)]
58#[serde(untagged)]
59pub enum Block {
60    /// [Actions block](https://docs.slack.dev/reference/block-kit/blocks/actions-block) representation
61    Actions(Box<Actions>),
62
63    /// [Alert block](https://docs.slack.dev/reference/block-kit/blocks/alert-block) representation
64    Alert(Box<Alert>),
65
66    /// [Card block](https://docs.slack.dev/reference/block-kit/blocks/card-block)
67    /// representation
68    Card(Box<Card>),
69
70    /// [Carousel block](https://docs.slack.dev/reference/block-kit/blocks/carousel-block)
71    /// representation
72    Carousel(Box<Carousel>),
73
74    /// [Context block](https://docs.slack.dev/reference/block-kit/blocks/context-block) representation
75    Context(Box<Context>),
76
77    /// [Context actions block](https://docs.slack.dev/reference/block-kit/blocks/context-actions-block) representation
78    ContextActions(Box<ContextActions>),
79
80    /// [Data table block](https://docs.slack.dev/reference/block-kit/blocks/data-table-block) representation
81    DataTable(Box<DataTable>),
82 
83    /// [Data visualization
84    /// block](https://docs.slack.dev/reference/block-kit/blocks/data-visualization-block)
85    /// representation
86    DataVisualization(Box<DataVisualization>),
87
88    /// [Divider block](https://docs.slack.dev/reference/block-kit/blocks/divider-block) representation
89    Divider(Box<Divider>),
90
91    /// [File block](https://docs.slack.dev/reference/block-kit/blocks/file-block) representation
92    File(Box<File>),
93
94    /// [Header block](https://docs.slack.dev/reference/block-kit/blocks/header-block) representation
95    Header(Box<Header>),
96
97    /// [Image block](https://docs.slack.dev/reference/block-kit/blocks/image-block) representation
98    Image(Box<Image>),
99
100    /// [Input block](https://docs.slack.dev/reference/block-kit/blocks/input-block) representation
101    Input(Box<Input>),
102
103    /// [Markdown block](https://docs.slack.dev/reference/block-kit/blocks/markdown-block) representation
104    Markdown(Box<Markdown>),
105
106    /// [Plan block](https://docs.slack.dev/reference/block-kit/blocks/plan-block) representation
107    Plan(Box<Plan>),
108
109    /// [Rich text block](https://docs.slack.dev/reference/block-kit/blocks/rich-text-block) representation
110    RichText(Box<RichText>),
111
112    /// [Section block](https://docs.slack.dev/reference/block-kit/blocks/section-block) representation
113    Section(Box<Section>),
114
115    /// [Table block](https://docs.slack.dev/reference/block-kit/blocks/table-block) representation
116    Table(Box<Table>),
117
118    /// [Task card block](https://docs.slack.dev/reference/block-kit/blocks/task-card-block)
119    /// representation
120    TaskCard(Box<TaskCard>),
121
122    /// [Video block](https://docs.slack.dev/reference/block-kit/blocks/video-block) representation
123    Video(Box<Video>),
124}
125
126macro_rules! block_from {
127    ($($ty:ident,)*) => {
128        $(
129            impl From<$ty> for Block {
130                fn from(value: $ty) -> Self {
131                    Self::$ty(Box::new(value))
132                }
133            }
134         )*
135    }
136}
137
138block_from! {
139    Actions,
140    Alert,
141    Card,
142    Carousel,
143    Context,
144    ContextActions,
145    DataTable,
146    DataVisualization,
147    Divider,
148    File,
149    Header,
150    Image,
151    Input,
152    Markdown,
153    Plan,
154    RichText,
155    Section,
156    Table,
157    TaskCard,
158    Video,
159}
160
161#[cfg(test)]
162pub mod test_helpers {
163    use super::rich_text::test_helpers as rich_text_helper;
164    use super::rich_text::types::test_helpers::*;
165    use super::*;
166    use crate::composition_objects::test_helpers::*;
167
168    pub fn header(text: impl Into<String>) -> Header {
169        Header {
170            block_id: None,
171            text: Some(plain_text(text)),
172        }
173    }
174
175    pub fn section(text: impl Into<String>) -> Section {
176        Section {
177            block_id: None,
178            text: Some(mrkdwn_text(text).into()),
179            fields: None,
180            accessory: None,
181            expand: None,
182        }
183    }
184
185    pub fn rich_text() -> RichText {
186        RichText {
187            block_id: Some("rich_text_0".into()),
188            elements: Some(vec![rich_text_helper::section(vec![el_text("foo")]).into()]),
189        }
190    }
191
192    pub fn task_card() -> TaskCard {
193        TaskCard {
194            task_id: Some("task_0".into()),
195            title: Some("Fetching weather data".into()),
196            status: Some(TaskStatus::Pending),
197            output: None,
198            details: None,
199            sources: None,
200            block_id: None,
201        }
202    }
203}