use despatma::visitor;
use slack_morphism::prelude::*;
pub(crate) struct SlackEventBlock {
#[allow(dead_code)]
pub json_value: serde_json::Value,
}
pub(crate) struct SlackRichTextBlock {
pub json_value: serde_json::Value,
}
visitor!(
#[
helper_tmpl = {
match slack_block {
SlackBlock::Section(section) => visitor.visit_slack_section_block(section),
SlackBlock::Header(header) => visitor.visit_slack_header_block(header),
SlackBlock::Divider(divider) => visitor.visit_slack_divider_block(divider),
SlackBlock::Image(image) => visitor.visit_slack_image_block(image),
SlackBlock::Actions(actions) => visitor.visit_slack_actions_block(actions),
SlackBlock::Context(context) => visitor.visit_slack_context_block(context),
SlackBlock::Input(input) => visitor.visit_slack_input_block(input),
SlackBlock::File(file) => visitor.visit_slack_file_block(file),
SlackBlock::Video(video) => visitor.visit_slack_video_block(video),
SlackBlock::RichText(rich_text_block) => visitor.visit_slack_rich_text_block(&SlackRichTextBlock { json_value: serde_json::to_value(rich_text_block).unwrap_or_default() }),
SlackBlock::Event(json_value) => visitor.visit_slack_event_block(&SlackEventBlock { json_value: json_value.clone() }),
SlackBlock::Markdown(markdown) => visitor.visit_slack_markdown_block(markdown),
SlackBlock::ShareShortcut(_) => {},
// Alert blocks (added in slack-morphism 2.23) carry a single text field.
SlackBlock::Alert(alert) => visitor.visit_slack_block_text(&alert.text),
// Table and TaskCard blocks (added in slack-morphism 2.22), Card, Carousel
// and ContextActions blocks (added in 2.23) carry no plain-text/markdown
// representation we can render, so emit nothing.
SlackBlock::Table(_)
| SlackBlock::TaskCard(_)
| SlackBlock::Card(_)
| SlackBlock::Carousel(_)
| SlackBlock::ContextActions(_) => {}
// Container blocks (added in slack-morphism 2.30) wrap other blocks:
// render their children so the content they hold is not lost.
SlackBlock::Container(container) => {
for child_block in &container.child_blocks {
visitor.visit_slack_block(child_block);
}
}
// Plan, DataTable and DataVisualization blocks (added in 2.30) carry no
// plain-text/markdown representation we can render, and Unknown keeps any
// block type slack-morphism does not model as raw JSON, so emit nothing.
SlackBlock::Plan(_)
| SlackBlock::DataTable(_)
| SlackBlock::DataVisualization(_)
| SlackBlock::Unknown(_) => {}
}
},
]
SlackBlock,
#[
helper_tmpl = {
if let Some(text) = &slack_section_block.text {
visitor.visit_slack_block_text(text);
}
if let Some(fields) = &slack_section_block.fields {
for field in fields {
visitor.visit_slack_block_text(field);
}
}
},
]
SlackSectionBlock,
#[
helper_tmpl = {
match slack_block_text {
SlackBlockText::Plain(plain) => visitor.visit_slack_block_plain_text(plain),
SlackBlockText::MarkDown(markdown) => visitor.visit_slack_block_mark_down_text(markdown),
}
},
]
SlackBlockText,
SlackBlockPlainText,
#[
helper_tmpl = {
let slack_block_text = slack_header_block.text.clone().into();
visitor.visit_slack_block_text(&slack_block_text);
},
]
SlackHeaderBlock,
SlackDividerBlock,
SlackImageBlock,
SlackBlockImageElement,
SlackActionsBlock,
#[
helper_tmpl = {
for element in &slack_context_block.elements {
match element {
SlackContextBlockElement::Image(image) => visitor.visit_slack_block_image_element(image),
SlackContextBlockElement::Plain(text) => visitor.visit_slack_block_plain_text(text),
SlackContextBlockElement::MarkDown(markdown) => visitor.visit_slack_block_mark_down_text(markdown),
}
}
},
]
SlackContextBlock,
SlackBlockMarkDownText,
SlackInputBlock,
SlackFileBlock,
SlackVideoBlock,
SlackEventBlock,
SlackRichTextBlock,
SlackMarkdownBlock,
);