block_kit 0.1.0

Simple wrapper for slack api
Documentation
use crate::block_element::OVERFLOW_MENU_TYPE;
use crate::composition::confirmation_dialog::ConfirmationDialog;
use crate::composition::option::OptionObject;
use serde::Serialize;

#[derive(Clone)]
pub enum OverflowMenuOption {
    TwoOptions([OptionObject; 2]),
    ThreeOptions([OptionObject; 3]),
    FourOptions([OptionObject; 4]),
    FiveOptions([OptionObject; 5]),
}

#[derive(Debug, Serialize)]
pub struct OverflowMenuElement {
    #[serde(rename = "type")]
    type_name: &'static str,
    action_id: String,
    options: Vec<OptionObject>,
    #[serde(skip_serializing_if = "Option::is_none")]
    confirm: Option<ConfirmationDialog>,
}

impl OverflowMenuElement {
    pub fn new(action_id: impl Into<String>, options: OverflowMenuOption) -> Self {
        let options = match options {
            self::OverflowMenuOption::TwoOptions(val) => val.to_vec(),
            self::OverflowMenuOption::ThreeOptions(val) => val.to_vec(),
            self::OverflowMenuOption::FourOptions(val) => val.to_vec(),
            self::OverflowMenuOption::FiveOptions(val) => val.to_vec(),
        };

        OverflowMenuElement {
            type_name: OVERFLOW_MENU_TYPE,
            action_id: action_id.into(),
            options,
            confirm: Option::default(),
        }
    }

    pub fn confirm(mut self, confirm: ConfirmationDialog) -> Self {
        self.confirm = Some(confirm);
        self
    }
}

#[cfg(test)]
mod test {
    use super::*;
    use crate::block_element::overflow_menu::OverflowMenuOption::TwoOptions;
    use crate::composition::text::PlainText;
    use crate::composition::text::Text::Plain;

    #[test]
    fn test_ser_new() {
        let option1 = OptionObject::new(PlainText::new("text1"), "value1");
        let option2 = OptionObject::new(PlainText::new("text2"), "value2");
        let menu = OverflowMenuElement::new("action", TwoOptions([option1, option2]));
        let json = serde_json::to_string_pretty(&menu).unwrap_or("".to_string());
        let expected = r#"{
  "type": "overflow",
  "action_id": "action",
  "options": [
    {
      "text": {
        "type": "plain_text",
        "text": "text1"
      },
      "value": "value1"
    },
    {
      "text": {
        "type": "plain_text",
        "text": "text2"
      },
      "value": "value2"
    }
  ]
}"#;

        assert_eq!(json, expected);
    }

    #[test]
    fn test_ser_confirm() {
        let option1 = OptionObject::new(PlainText::new("text1"), "value1");
        let option2 = OptionObject::new(PlainText::new("text2"), "value2");
        let confirm = ConfirmationDialog::new(
            PlainText::new("title"),
            Plain(PlainText::new("text")),
            PlainText::new("confirm"),
            PlainText::new("deny"),
        );

        let menu =
            OverflowMenuElement::new("action", TwoOptions([option1, option2])).confirm(confirm);
        let json = serde_json::to_string_pretty(&menu).unwrap_or("".to_string());
        let expected = r#"{
  "type": "overflow",
  "action_id": "action",
  "options": [
    {
      "text": {
        "type": "plain_text",
        "text": "text1"
      },
      "value": "value1"
    },
    {
      "text": {
        "type": "plain_text",
        "text": "text2"
      },
      "value": "value2"
    }
  ],
  "confirm": {
    "title": {
      "type": "plain_text",
      "text": "title"
    },
    "text": {
      "type": "plain_text",
      "text": "text"
    },
    "confirm": {
      "type": "plain_text",
      "text": "confirm"
    },
    "deny": {
      "type": "plain_text",
      "text": "deny"
    }
  }
}"#;

        assert_eq!(json, expected);
    }
}