slack-blocks 0.25.0

Models + clientside validation for Slack's JSON Block Kit
Documentation
use pretty_assertions::assert_eq;
use serde_json::json;
use slack_blocks::{blox::*, elems, text::ToSlackPlaintext};

#[test]
pub fn docs_ex_1() {
  let opt_1 = blox! {<option value="A1" text_plain="Checkbox 1" />};
  let block: elems::BlockElement =
    blox! {
      <checkboxes action_id="this_is_an_action_id" initial_options=vec![opt_1.clone()]>
        {opt_1}
        <option value="A2" text_plain="Checkbox 2" />
      </checkboxes>
    }.into();
  let actual = serde_json::to_value(block).unwrap();
  let expected = json!({
    "type": "checkboxes",
    "action_id": "this_is_an_action_id",
    "initial_options": [{
      "value": "A1",
      "text": {
        "type": "plain_text",
        "text": "Checkbox 1"
      }
    }],
    "options": [
      {
        "value": "A1",
        "text": {
          "type": "plain_text",
          "text": "Checkbox 1"
        }
      },
      {
        "value": "A2",
        "text": {
          "type": "plain_text",
          "text": "Checkbox 2"
        }
      }
    ]
  });

  assert_eq!(actual, expected);
}

#[test]
pub fn all_attributes() {
  let opt_1 = blox! {<option value="A1" text_plain="Checkbox 1" />};
  let confirm = blox! {
    <confirm title="You sure?"
             text="yes or no, are you sure?".plaintext()
             confirm="Yes"
             deny="No"
    />
  };
  let block: elems::BlockElement =
    blox! {
      <checkboxes confirm action_id="this_is_an_action_id" initial_options=vec![opt_1.clone()]>
        {opt_1}
        <option value="A2" text_plain="Checkbox 2" />
      </checkboxes>
    }.into();
  let actual = serde_json::to_value(block).unwrap();
  let expected = json!({
    "type": "checkboxes",
    "action_id": "this_is_an_action_id",
    "confirm": {
      "title": {"type": "plain_text", "text": "You sure?"},
      "text": {"type": "plain_text", "text": "yes or no, are you sure?"},
      "confirm": {"type": "plain_text", "text": "Yes"},
      "deny": {"type": "plain_text", "text": "No"}
    },
    "initial_options": [{
      "value": "A1",
      "text": {
        "type": "plain_text",
        "text": "Checkbox 1"
      }
    }],
    "options": [
      {
        "value": "A1",
        "text": {
          "type": "plain_text",
          "text": "Checkbox 1"
        }
      },
      {
        "value": "A2",
        "text": {
          "type": "plain_text",
          "text": "Checkbox 2"
        }
      }
    ]
  });

  assert_eq!(actual, expected);
}