slack_bk/
blocks.rs

1use serde::{Deserialize, Serialize};
2
3use crate::composition::Text;
4use crate::elements;
5
6#[derive(Debug, Deserialize, Serialize)]
7#[serde(tag = "type", rename_all = "lowercase")]
8pub enum Block {
9    Actions(Actions),
10    Context(Context),
11    Divider(Divider),
12    File(File),
13    Header(Header),
14    Image(Image),
15    Input(Input),
16    Section(Section),
17}
18
19#[derive(Debug, Deserialize, Serialize, Default)]
20pub struct Actions {
21    pub elements: Vec<elements::Element>,
22
23    #[serde(default, skip_serializing_if = "Option::is_none")]
24    pub block_id: Option<String>,
25}
26
27#[derive(Debug, Deserialize, Serialize)]
28#[serde(untagged)]
29pub enum ContextElement {
30    Image(elements::Element),
31    Text(Text),
32}
33
34#[derive(Debug, Deserialize, Serialize, Default)]
35pub struct Context {
36    pub elements: Vec<ContextElement>,
37
38    #[serde(default, skip_serializing_if = "Option::is_none")]
39    pub block_id: Option<String>,
40}
41
42#[derive(Debug, Deserialize, Serialize, Default)]
43pub struct Divider {
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub block_id: Option<String>,
46}
47
48#[derive(Debug, Deserialize, Serialize)]
49#[serde(rename_all = "lowercase")]
50pub enum FileSource {
51    Remote,
52}
53
54#[derive(Debug, Deserialize, Serialize)]
55pub struct File {
56    pub external_id: String,
57
58    pub source: FileSource,
59
60    #[serde(default, skip_serializing_if = "Option::is_none")]
61    pub block_id: Option<String>,
62}
63
64#[derive(Debug, Deserialize, Serialize)]
65pub struct Header {
66    pub text: Text,
67
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub block_id: Option<String>,
70}
71
72#[derive(Debug, Deserialize, Serialize)]
73pub struct Image {
74    pub image_url: String,
75    pub alt_text: String,
76
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    pub title: Option<Text>,
79
80    #[serde(default, skip_serializing_if = "Option::is_none")]
81    pub block_id: Option<String>,
82}
83
84#[derive(Debug, Deserialize, Serialize)]
85pub struct Input {
86    pub label: Text,
87    pub element: elements::Element,
88
89    #[serde(default)]
90    pub dispatch_action: bool,
91
92    #[serde(default, skip_serializing_if = "Option::is_none")]
93    pub block_id: Option<String>,
94
95    #[serde(default, skip_serializing_if = "Option::is_none")]
96    pub hint: Option<Text>,
97
98    #[serde(default)]
99    pub optional: bool,
100}
101
102#[derive(Debug, Deserialize, Serialize, Default)]
103pub struct Section {
104    #[serde(default, skip_serializing_if = "Option::is_none")]
105    pub text: Option<Text>,
106
107    #[serde(default, skip_serializing_if = "Vec::is_empty")]
108    pub fields: Vec<Text>,
109
110    #[serde(default, skip_serializing_if = "Option::is_none")]
111    pub accessory: Option<elements::Element>,
112
113    #[serde(default, skip_serializing_if = "Option::is_none")]
114    pub block_id: Option<String>,
115}