slack-blocks-render 0.5.4

Slack blocks render is a Rust library to render Slack blocks as Markdown.
Documentation
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,
);