func NewCheckboxGroupsBlockElement(actionID string, options ...*OptionBlockObject) *CheckboxGroupsBlockElement {
	return &CheckboxGroupsBlockElement{
		Type:     METCheckboxGroups,
		ActionID: actionID,
		Options:  options,
	}
}
NewRadioButtonsBlockElement returns an instance of a radio block element
package slack
const (
	METCheckboxGroups MessageElementType = "checkboxes"
	METImage          MessageElementType = "image"
	METButton         MessageElementType = "button"
	METOverflow       MessageElementType = "overflow"
	METDatepicker     MessageElementType = "datepicker"
	METPlainTextInput MessageElementType = "plain_text_input"
	METRadioButtons   MessageElementType = "radio_buttons"
	MixedElementImage MixedElementType = "mixed_image"
	MixedElementText  MixedElementType = "mixed_text"
	OptTypeStatic        string = "static_select"
	OptTypeExternal      string = "external_select"
	OptTypeUser          string = "users_select"
	OptTypeConversations string = "conversations_select"
	OptTypeChannels      string = "channels_select"
	MultiOptTypeStatic        string = "multi_static_select"
	MultiOptTypeExternal      string = "multi_external_select"
	MultiOptTypeUser          string = "multi_users_select"
	MultiOptTypeConversations string = "multi_conversations_select"
	MultiOptTypeChannels      string = "multi_channels_select"
)
type MessageElementType string
type MixedElementType string
type BlockElement interface {
	ElementType() MessageElementType
}
type MixedElement interface {
	MixedElementType() MixedElementType
}
type Accessory struct {
	ImageElement          *ImageBlockElement
	ButtonElement         *ButtonBlockElement
	OverflowElement       *OverflowBlockElement
	DatePickerElement     *DatePickerBlockElement
	PlainTextInputElement *PlainTextInputBlockElement
	RadioButtonsElement   *RadioButtonsBlockElement
	SelectElement         *SelectBlockElement
	MultiSelectElement    *MultiSelectBlockElement
	UnknownElement        *UnknownBlockElement
}
func NewAccessory(element BlockElement) *Accessory {
	switch element.(type) {
	case *ImageBlockElement:
		return &Accessory{ImageElement: element.(*ImageBlockElement)}
	case *ButtonBlockElement:
		return &Accessory{ButtonElement: element.(*ButtonBlockElement)}
	case *OverflowBlockElement:
		return &Accessory{OverflowElement: element.(*OverflowBlockElement)}
	case *DatePickerBlockElement:
		return &Accessory{DatePickerElement: element.(*DatePickerBlockElement)}
	case *PlainTextInputBlockElement:
		return &Accessory{PlainTextInputElement: element.(*PlainTextInputBlockElement)}
	case *RadioButtonsBlockElement:
		return &Accessory{RadioButtonsElement: element.(*RadioButtonsBlockElement)}
	case *SelectBlockElement:
		return &Accessory{SelectElement: element.(*SelectBlockElement)}
	case *MultiSelectBlockElement:
		return &Accessory{MultiSelectElement: element.(*MultiSelectBlockElement)}
	default:
		return &Accessory{UnknownElement: element.(*UnknownBlockElement)}
	}
}
type BlockElements struct {
	ElementSet []BlockElement `json:"elements,omitempty"`
}
type UnknownBlockElement struct {
	Type     MessageElementType `json:"type"`
	Elements BlockElements
}
func (s UnknownBlockElement) ElementType() MessageElementType {
	return s.Type
}
type ImageBlockElement struct {
	Type     MessageElementType `json:"type"`
	ImageURL string             `json:"image_url"`
	AltText  string             `json:"alt_text"`
}
func (s ImageBlockElement) ElementType() MessageElementType {
	return s.Type
}
func (s ImageBlockElement) MixedElementType() MixedElementType {
	return MixedElementImage
}
func NewImageBlockElement(imageURL, altText string) *ImageBlockElement {
	return &ImageBlockElement{
		Type:     METImage,
		ImageURL: imageURL,
		AltText:  altText,
	}
}
type Style string
const (
	StyleDefault Style = "default"
	StylePrimary Style = "primary"
	StyleDanger  Style = "danger"
)
type ButtonBlockElement struct {
	Type     MessageElementType       `json:"type,omitempty"`
	Text     *TextBlockObject         `json:"text"`
	ActionID string                   `json:"action_id,omitempty"`
	URL      string                   `json:"url,omitempty"`
	Value    string                   `json:"value,omitempty"`
	Confirm  *ConfirmationBlockObject `json:"confirm,omitempty"`
	Style    Style                    `json:"style,omitempty"`
}
func (s ButtonBlockElement) ElementType() MessageElementType {
	return s.Type
}
func (s *ButtonBlockElement) WithStyle(style Style) {
	s.Style = style
}
func NewButtonBlockElement(actionID, value string, text *TextBlockObject) *ButtonBlockElement {
	return &ButtonBlockElement{
		Type:     METButton,
		ActionID: actionID,
		Text:     text,
		Value:    value,
	}
}
type OptionsResponse struct {
	Options []*OptionBlockObject `json:"options,omitempty"`
}
type OptionGroupsResponse struct {
	OptionGroups []*OptionGroupBlockObject `json:"option_groups,omitempty"`
}
type SelectBlockElement struct {
	Type                string                    `json:"type,omitempty"`
	Placeholder         *TextBlockObject          `json:"placeholder,omitempty"`
	ActionID            string                    `json:"action_id,omitempty"`
	Options             []*OptionBlockObject      `json:"options,omitempty"`
	OptionGroups        []*OptionGroupBlockObject `json:"option_groups,omitempty"`
	InitialOption       *OptionBlockObject        `json:"initial_option,omitempty"`
	InitialUser         string                    `json:"initial_user,omitempty"`
	InitialConversation string                    `json:"initial_conversation,omitempty"`
	InitialChannel      string                    `json:"initial_channel,omitempty"`
	MinQueryLength      *int                      `json:"min_query_length,omitempty"`
	Confirm             *ConfirmationBlockObject  `json:"confirm,omitempty"`
}
func (s SelectBlockElement) ElementType() MessageElementType {
	return MessageElementType(s.Type)
}
func NewOptionsSelectBlockElement(optType string, placeholder *TextBlockObject, actionID string, options ...*OptionBlockObject) *SelectBlockElement {
	return &SelectBlockElement{
		Type:        optType,
		Placeholder: placeholder,
		ActionID:    actionID,
		Options:     options,
	}
}
func NewOptionsGroupSelectBlockElement(
	optType string,
	placeholder *TextBlockObject,
	actionID string,
	optGroups ...*OptionGroupBlockObject,
) *SelectBlockElement {
	return &SelectBlockElement{
		Type:         optType,
		Placeholder:  placeholder,
		ActionID:     actionID,
		OptionGroups: optGroups,
	}
}
type MultiSelectBlockElement struct {
	Type                 string                    `json:"type,omitempty"`
	Placeholder          *TextBlockObject          `json:"placeholder,omitempty"`
	ActionID             string                    `json:"action_id,omitempty"`
	Options              []*OptionBlockObject      `json:"options,omitempty"`
	OptionGroups         []*OptionGroupBlockObject `json:"option_groups,omitempty"`
	InitialOptions       []*OptionBlockObject      `json:"initial_options,omitempty"`
	InitialUsers         []string                  `json:"initial_users,omitempty"`
	InitialConversations []string                  `json:"initial_conversations,omitempty"`
	InitialChannels      []string                  `json:"initial_channels,omitempty"`
	MinQueryLength       *int                      `json:"min_query_length,omitempty"`
	Confirm              *ConfirmationBlockObject  `json:"confirm,omitempty"`
}
func (s MultiSelectBlockElement) ElementType() MessageElementType {
	return MessageElementType(s.Type)
}
func NewOptionsMultiSelectBlockElement(optType string, placeholder *TextBlockObject, actionID string, options ...*OptionBlockObject) *MultiSelectBlockElement {
	return &MultiSelectBlockElement{
		Type:        optType,
		Placeholder: placeholder,
		ActionID:    actionID,
		Options:     options,
	}
}
func NewOptionsGroupMultiSelectBlockElement(
	optType string,
	placeholder *TextBlockObject,
	actionID string,
	optGroups ...*OptionGroupBlockObject,
) *MultiSelectBlockElement {
	return &MultiSelectBlockElement{
		Type:         optType,
		Placeholder:  placeholder,
		ActionID:     actionID,
		OptionGroups: optGroups,
	}
}
type OverflowBlockElement struct {
	Type     MessageElementType       `json:"type"`
	ActionID string                   `json:"action_id,omitempty"`
	Options  []*OptionBlockObject     `json:"options"`
	Confirm  *ConfirmationBlockObject `json:"confirm,omitempty"`
}
func (s OverflowBlockElement) ElementType() MessageElementType {
	return s.Type
}
func NewOverflowBlockElement(actionID string, options ...*OptionBlockObject) *OverflowBlockElement {
	return &OverflowBlockElement{
		Type:     METOverflow,
		ActionID: actionID,
		Options:  options,
	}
}
type DatePickerBlockElement struct {
	Type        MessageElementType       `json:"type"`
	ActionID    string                   `json:"action_id"`
	Placeholder *TextBlockObject         `json:"placeholder,omitempty"`
	InitialDate string                   `json:"initial_date,omitempty"`
	Confirm     *ConfirmationBlockObject `json:"confirm,omitempty"`
}
func (s DatePickerBlockElement) ElementType() MessageElementType {
	return s.Type
}
func NewDatePickerBlockElement(actionID string) *DatePickerBlockElement {
	return &DatePickerBlockElement{
		Type:     METDatepicker,
		ActionID: actionID,
	}
}
type PlainTextInputBlockElement struct {
	Type         MessageElementType `json:"type"`
	ActionID     string             `json:"action_id"`
	Placeholder  *TextBlockObject   `json:"placeholder,omitempty"`
	InitialValue string             `json:"initial_value,omitempty"`
	Multiline    bool               `json:"multiline,omitempty"`
	MinLength    int                `json:"min_length,omitempty"`
	MaxLength    int                `json:"max_length,omitempty"`
}
func (s PlainTextInputBlockElement) ElementType() MessageElementType {
	return s.Type
}
func NewPlainTextInputBlockElement(placeholder *TextBlockObject, actionID string) *PlainTextInputBlockElement {
	return &PlainTextInputBlockElement{
		Type:        METPlainTextInput,
		ActionID:    actionID,
		Placeholder: placeholder,
	}
}
type CheckboxGroupsBlockElement struct {
	Type           MessageElementType       `json:"type"`
	ActionID       string                   `json:"action_id"`
	Options        []*OptionBlockObject     `json:"options"`
	InitialOptions []*OptionBlockObject     `json:"initial_options,omitempty"`
	Confirm        *ConfirmationBlockObject `json:"confirm,omitempty"`
}
func (c CheckboxGroupsBlockElement) ElementType() MessageElementType {
	return c.Type
}