#slack #webhook

slack-messaging

Support building Slack Block Kit message

17 releases (6 breaking)

Uses new Rust 2024

0.7.2 Dec 18, 2025
0.6.0 Dec 12, 2025
0.5.3 Nov 26, 2025
0.5.0 Jun 23, 2025
0.2.2 Mar 2, 2023

#133 in Web programming

Download history 1116/week @ 2025-10-19 1450/week @ 2025-10-26 2464/week @ 2025-11-02 3005/week @ 2025-11-09 3150/week @ 2025-11-16 1698/week @ 2025-11-23 2215/week @ 2025-11-30 2028/week @ 2025-12-07 2742/week @ 2025-12-14 708/week @ 2025-12-21 961/week @ 2025-12-28 3033/week @ 2026-01-04 2270/week @ 2026-01-11 1543/week @ 2026-01-18 2130/week @ 2026-01-25 2286/week @ 2026-02-01

8,339 downloads per month
Used in 2 crates

MIT license

470KB
9K SLoC

Slack Messaging

Version License Test

This is a library for Rust to support building Slack Block Kit messages. Using this, you can build any messages in type-safe way like following.

use slack_messaging::{mrkdwn, plain_text, Message};
use slack_messaging::blocks::{elements::Button, Actions, Section};
use std::error::Error;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let message = Message::builder()
        .block(
            Section::builder()
                .text(mrkdwn!("You have a new request:\n*<fakeLink.toEmployeeProfile.com|Fred Enriquez - New device request>*")?)
                .build()?
        )
        .block(
            Section::builder()
                .field(mrkdwn!("*Type:*\nComputer (laptop)")?)
                .field(mrkdwn!("*When:*\nSubmitted Aug 10")?)
                .build()?
        )
        .block(
            Actions::builder()
                .element(
                    Button::builder()
                        .text(plain_text!("Approve")?)
                        .value("approve")
                        .primary()
                        .build()?
                )
                .element(
                    Button::builder()
                        .text(plain_text!("Deny")?)
                        .value("deny")
                        .danger()
                        .build()?
                )
                .build()?
        )
        .build()?;

    let req = reqwest::Client::new()
        .post("https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX")
        .json(&message);

    if let Err(err) = req.send().await {
        eprintln!("{err}");
    }

    Ok(())
}

The message payload of the above example is following.

{
    "blocks": [
        {
            "type": "section",
            "text": {
                "type": "mrkdwn",
                "text": "You have a new request:\n*<fakeLink.toEmployeeProfile.com|Fred Enriquez - New device request>*"
            }
        },
        {
            "type": "section",
            "fields": [
                {
                    "type": "mrkdwn",
                    "text": "*Type:*\nComputer (laptop)"
                },
                {
                    "type": "mrkdwn",
                    "text": "*When:*\nSubmitted Aug 10"
                }
            ]
        },
        {
            "type": "actions",
            "elements": [
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Approve"
                    },
                    "value": "approve",
                    "style": "primary"
                },
                {
                    "type": "button",
                    "text": {
                        "type": "plain_text",
                        "text": "Deny"
                    },
                    "value": "deny",
                    "style": "danger"
                }
            ]
        }
    ]
}

License

This software is released under the MIT License.

Dependencies

~4–6MB
~110K SLoC