Skip to main content

uptrakit_surfaces/
form.rs

1use 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}