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(json_value) => visitor.visit_slack_rich_text_block(&SlackRichTextBlock { json_value: json_value.clone() }),
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(_) => todo!()
30            }
31        },
32    ]
33    SlackBlock,
34    #[
35        helper_tmpl = {
36            if let Some(text) = &slack_section_block.text {
37                visitor.visit_slack_block_text(text);
38            }
39            if let Some(fields) = &slack_section_block.fields {
40                for field in fields {
41                    visitor.visit_slack_block_text(field);
42                }
43            }
44        },
45    ]
46    SlackSectionBlock,
47    #[
48        helper_tmpl = {
49            match slack_block_text {
50                SlackBlockText::Plain(plain) => visitor.visit_slack_block_plain_text(plain),
51                SlackBlockText::MarkDown(markdown) => visitor.visit_slack_block_mark_down_text(markdown),
52            }
53        },
54    ]
55    SlackBlockText,
56    SlackBlockPlainText,
57    #[
58        helper_tmpl = {
59            let slack_block_text = slack_header_block.text.clone().into();
60            visitor.visit_slack_block_text(&slack_block_text);
61        },
62    ]
63    SlackHeaderBlock,
64    SlackDividerBlock,
65    SlackImageBlock,
66    SlackBlockImageElement,
67    SlackActionsBlock,
68    #[
69        helper_tmpl = {
70            for element in &slack_context_block.elements {
71                match element {
72                    SlackContextBlockElement::Image(image) => visitor.visit_slack_block_image_element(image),
73                    SlackContextBlockElement::Plain(text) => visitor.visit_slack_block_plain_text(text),
74                    SlackContextBlockElement::MarkDown(markdown) => visitor.visit_slack_block_mark_down_text(markdown),
75                }
76            }
77        },
78    ]
79    SlackContextBlock,
80    SlackBlockMarkDownText,
81    SlackInputBlock,
82    SlackFileBlock,
83    SlackVideoBlock,
84    SlackEventBlock,
85    SlackRichTextBlock,
86    SlackMarkdownBlock,
87);