uptrakit-surfaces 0.0.3

Shared surface contracts for built-in and provider UI integration
Documentation
use serde::{Deserialize, Serialize};

use crate::InteractionId;

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FormUiDescriptor {
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub fields: Vec<FormFieldDescriptor>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub pre_load_interaction_id: Option<InteractionId>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FormFieldDescriptor {
    pub key: String,
    pub label: String,
    pub field_type: String,
    pub required: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub placeholder: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub help_text: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub default_value: Option<String>,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub options: Vec<FormSelectOption>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub select_source: Option<FormSelectSource>,
    #[serde(default, skip_serializing_if = "std::ops::Not::not")]
    pub sensitive: bool,
    #[serde(default, skip_serializing_if = "std::ops::Not::not")]
    pub list: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub visible_when: Option<FormVisibleWhen>,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FormSelectOption {
    pub value: String,
    pub label: String,
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum FormSelectSource {
    RestApi {
        path: String,
        value_field: String,
        label_field: String,
    },
    Action {
        action_id: String,
    },
}

#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FormVisibleWhen {
    pub field: String,
    #[serde(default, skip_serializing_if = "Vec::is_empty")]
    pub values: Vec<String>,
}