uptrakit_surfaces/
form.rs1use serde::{Deserialize, Serialize};
2
3use crate::InteractionId;
4
5#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
6pub struct FormUiDescriptor {
7 #[serde(default, skip_serializing_if = "Vec::is_empty")]
8 pub fields: Vec<FormFieldDescriptor>,
9 #[serde(default, skip_serializing_if = "Option::is_none")]
10 pub pre_load_interaction_id: Option<InteractionId>,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
14pub struct FormFieldDescriptor {
15 pub key: String,
16 pub label: String,
17 pub field_type: String,
18 pub required: bool,
19 #[serde(default, skip_serializing_if = "Option::is_none")]
20 pub placeholder: Option<String>,
21 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub help_text: Option<String>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub default_value: Option<String>,
25 #[serde(default, skip_serializing_if = "Vec::is_empty")]
26 pub options: Vec<FormSelectOption>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub select_source: Option<FormSelectSource>,
29 #[serde(default, skip_serializing_if = "std::ops::Not::not")]
30 pub sensitive: bool,
31 #[serde(default, skip_serializing_if = "std::ops::Not::not")]
32 pub list: bool,
33 #[serde(default, skip_serializing_if = "Option::is_none")]
34 pub visible_when: Option<FormVisibleWhen>,
35}
36
37#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
38pub struct FormSelectOption {
39 pub value: String,
40 pub label: String,
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
44#[serde(rename_all = "snake_case", tag = "type")]
45pub enum FormSelectSource {
46 RestApi {
47 path: String,
48 value_field: String,
49 label_field: String,
50 },
51 Action {
52 action_id: String,
53 },
54}
55
56#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub struct FormVisibleWhen {
58 pub field: String,
59 #[serde(default, skip_serializing_if = "Vec::is_empty")]
60 pub values: Vec<String>,
61}