1use serde::{Deserialize, Serialize};
2
3use crate::common::ComponentId;
4
5#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
14#[serde(deny_unknown_fields)]
15pub struct DataBinding {
16 #[serde(rename = "@path")]
18 pub path: String,
19}
20
21#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
25#[serde(deny_unknown_fields)]
26pub struct FunctionCall {
27 #[serde(rename = "@call")]
29 pub call: String,
30
31 #[serde(rename = "catalogId", skip_serializing_if = "Option::is_none")]
33 pub catalog_id: Option<String>,
34
35 #[serde(skip_serializing_if = "Option::is_none")]
37 pub args: Option<serde_json::Value>,
38}
39
40#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
46#[serde(untagged)]
47pub enum DynamicString {
48 Literal(String),
49 Binding(DataBinding),
50 Function(FunctionCall),
51}
52
53#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
55#[serde(untagged)]
56pub enum DynamicNumber {
57 Literal(f64),
58 Binding(DataBinding),
59 Function(FunctionCall),
60}
61
62#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
64#[serde(untagged)]
65pub enum DynamicBoolean {
66 Literal(bool),
67 Binding(DataBinding),
68 Function(FunctionCall),
69}
70
71#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
73#[serde(untagged)]
74pub enum DynamicStringList {
75 Literal(Vec<String>),
76 Binding(DataBinding),
77 Function(FunctionCall),
78}
79
80#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
82#[serde(untagged)]
83pub enum DynamicValue {
84 String(String),
85 Number(f64),
86 Bool(bool),
87 Array(Vec<serde_json::Value>),
88 Binding(DataBinding),
89 Function(FunctionCall),
90 Object(serde_json::Value),
91}
92
93#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
99#[serde(deny_unknown_fields)]
100pub struct ChildListTemplate {
101 #[serde(rename = "componentId")]
103 pub component_id: ComponentId,
104
105 pub path: String,
107}
108
109#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
112#[serde(untagged)]
113pub enum ChildList {
114 Static(Vec<ComponentId>),
115 Template(ChildListTemplate),
116}
117
118#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
124#[serde(deny_unknown_fields)]
125pub struct ActionEvent {
126 pub name: String,
128
129 #[serde(rename = "userMessage", skip_serializing_if = "Option::is_none")]
131 pub user_message: Option<DynamicString>,
132
133 #[serde(skip_serializing_if = "Option::is_none")]
135 pub context: Option<serde_json::Value>,
136}
137
138#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
140#[serde(untagged)]
141pub enum Action {
142 Event {
143 #[serde(rename = "event")]
144 event: ActionEvent,
145 },
146 FunctionCall {
147 #[serde(rename = "functionCall")]
148 function_call: FunctionCall,
149 },
150}
151
152#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
159#[serde(untagged)]
160pub enum CheckCondition {
161 Binding(DataBinding),
162 Function(FunctionCall),
163}
164
165#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
167#[serde(deny_unknown_fields)]
168pub struct CheckRule {
169 pub condition: CheckCondition,
171
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub message: Option<String>,
175}
176
177#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
179pub struct ValidationResult {
180 pub valid: bool,
182
183 #[serde(skip_serializing_if = "Option::is_none")]
185 pub code: Option<String>,
186
187 #[serde(skip_serializing_if = "Option::is_none")]
189 pub message: Option<String>,
190
191 #[serde(skip_serializing_if = "Option::is_none")]
193 pub severity: Option<ValidationSeverity>,
194}
195
196#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
198#[serde(rename_all = "lowercase")]
199pub enum ValidationSeverity {
200 Error,
201 Warning,
202 Info,
203}
204
205#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
211pub struct AccessibilityAttributes {
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub label: Option<DynamicString>,
215
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub description: Option<DynamicString>,
219
220 #[serde(skip_serializing_if = "Option::is_none")]
222 pub live: Option<AccessibilityLive>,
223
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub hidden: Option<DynamicBoolean>,
227}
228
229#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
231#[serde(rename_all = "lowercase")]
232pub enum AccessibilityLive {
233 Off,
234 Polite,
235 Assertive,
236}
237
238#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
244#[serde(deny_unknown_fields)]
245pub struct FunctionError {
246 pub code: String,
248
249 pub message: String,
251}
252
253#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
255pub struct FunctionResponse {
256 #[serde(rename = "functionCallId")]
258 pub function_call_id: String,
259
260 #[serde(skip_serializing_if = "Option::is_none")]
262 pub value: Option<serde_json::Value>,
263
264 #[serde(skip_serializing_if = "Option::is_none")]
266 pub error: Option<FunctionError>,
267}