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}