use serde::Serialize;
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ParamConditionEntry {
pub param: String,
pub equals: String,
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(untagged)]
pub enum ParamCondition {
Single(ParamConditionEntry),
Any(Vec<ParamConditionEntry>),
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct OptionEntry {
pub value: String,
pub label: String,
}
#[derive(Debug, Clone, Serialize, PartialEq, Default)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum ParameterType {
Number,
#[default]
String,
Boolean,
Enum {
options: Vec<OptionEntry>,
},
Object,
File {
accept: Vec<std::string::String>,
},
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Constraints {
#[serde(skip_serializing_if = "Option::is_none")]
pub min: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max: Option<f64>,
pub required: bool,
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct PresetEntry {
pub value: serde_json::Value,
pub label: String,
}
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct ParameterDef {
pub name: std::string::String,
pub label: std::string::String,
pub description: std::string::String,
pub param_type: ParameterType,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub constraints: Option<Constraints>,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub visible_when: Option<ParamCondition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required_when: Option<ParamCondition>,
#[serde(default = "default_true")]
pub surfaceable: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub group: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub control: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub accept: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presets: Option<Vec<PresetEntry>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inverted: Option<bool>,
}
#[allow(dead_code)]
fn default_true() -> bool {
true
}
impl Default for ParameterDef {
fn default() -> Self {
Self {
name: String::default(),
label: String::default(),
description: String::default(),
param_type: ParameterType::default(),
default: None,
constraints: None,
placeholder: None,
visible_when: None,
required_when: None,
surfaceable: true,
group: None,
suffix: None,
control: None,
accept: None,
presets: None,
inverted: None,
}
}
}