Skip to main content

slack_blocks_render/
visitor.rs

1use despatma::visitor;
2use slack_morphism::prelude::*;
3
4pub(crate) struct SlackEventBlock {
5    #[allow(dead_code)]
6    pub json_value: serde_json::Value,
7}
8
9pub(crate) struct SlackRichTextBlock {
10    pub json_value: serde_json::Value,
11}
12
13visitor!(
14    #[
15        helper_tmpl = {
16            match slack_block {
17                SlackBlock::Section(section) => visitor.visit_slack_section_block(section),
18                SlackBlock::Header(header) => visitor.visit_slack_header_block(header),
19                SlackBlock::Divider(divider) => visitor.visit_slack_divider_block(divider),
20                SlackBlock::Image(image) => visitor.visit_slack_image_block(image),
21                SlackBlock::Actions(actions) => visitor.visit_slack_actions_block(actions),
22                SlackBlock::Context(context) => visitor.visit_slack_context_block(context),
23                SlackBlock::Input(input) => visitor.visit_slack_input_block(input),
24                SlackBlock::File(file) => visitor.visit_slack_file_block(file),
25                SlackBlock::Video(video) => visitor.visit_slack_video_block(video),
26                SlackBlock::RichText(rich_text_block) => visitor.visit_slack_rich_text_block(&SlackRichTextBlock { json_value: serde_json::to_value(rich_text_block).unwrap_or_default() }),
27                SlackBlock::Event(json_value) => visitor.visit_slack_event_block(&SlackEventBlock { json_value: json_value.clone() }),
28                SlackBlock::Markdown(markdown) => visitor.visit_slack_markdown_block(markdown),
29                SlackBlock::ShareShortcut(_) => {},
30                // Table and TaskCard blocks (added in slack-morphism 2.22) carry no
31                // plain-text/markdown representation we can render, so emit nothing.
32                SlackBlock::Table(_) | SlackBlock::TaskCard(_) => {}
33            }
34        },
35    ]
36    SlackBlock,
37    #[
38        helper_tmpl = {
39            if let Some(text) = &slack_section_block.text {
40                visitor.visit_slack_block_text(text);
41            }
42            if let Some(fields) = &slack_section_block.fields {
43                for field in fields {
44                    visitor.visit_slack_block_text(field);
45                }
46            }
47        },
48    ]
49    SlackSectionBlock,
50    #[
51        helper_tmpl = {
52            match slack_block_text {
53                SlackBlockText::Plain(plain) => visitor.visit_slack_block_plain_text(plain),
54                SlackBlockText::MarkDown(markdown) => visitor.visit_slack_block_mark_down_text(markdown),
55            }
56        },
57    ]
58    SlackBlockText,
59    SlackBlockPlainText,
60    #[
61        helper_tmpl = {
62            let slack_block_text = slack_header_block.text.clone().into();
63            visitor.visit_slack_block_text(&slack_block_text);
64        },
65    ]
66    SlackHeaderBlock,
67    SlackDividerBlock,
68    SlackImageBlock,
69    SlackBlockImageElement,
70    SlackActionsBlock,
71    #[
72        helper_tmpl = {
73            for element in &slack_context_block.elements {
74                match element {
75                    SlackContextBlockElement::Image(image) => visitor.visit_slack_block_image_element(image),
76                    SlackContextBlockElement::Plain(text) => visitor.visit_slack_block_plain_text(text),
77                    SlackContextBlockElement::MarkDown(markdown) => visitor.visit_slack_block_mark_down_text(markdown),
78                }
79            }
80        },
81    ]
82    SlackContextBlock,
83    SlackBlockMarkDownText,
84    SlackInputBlock,
85    SlackFileBlock,
86    SlackVideoBlock,
87    SlackEventBlock,
88    SlackRichTextBlock,
89    SlackMarkdownBlock,
90);