use nitro_shared::Side;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, PartialEq, Default)]
pub struct Control {
pub id: String,
pub name: String,
pub schema: ControlSchema,
#[serde(default)]
pub default: Option<serde_json::Value>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub color: Option<String>,
#[serde(default)]
pub icon: Option<String>,
#[serde(default)]
pub section: Option<String>,
#[serde(default)]
pub always_serialize: bool,
#[serde(default)]
pub side: Option<Side>,
}
#[derive(Serialize, Deserialize, Clone, PartialEq, Default)]
#[serde(rename_all = "snake_case")]
#[serde(tag = "type")]
pub enum ControlSchema {
#[default]
Boolean,
Section,
Choice {
variants: Vec<Variant>,
#[serde(default)]
dropdown: bool,
#[serde(default)]
multiple: bool,
},
String {
#[serde(default)]
lowercase: bool,
},
Path {
#[serde(default)]
directory: bool,
},
Number {
min: Option<f32>,
max: Option<f32>,
step: f32,
#[serde(default)]
slider: bool,
},
StringList,
List {
fields: Vec<Control>,
#[serde(default)]
is_map: bool,
},
Json,
Keybind,
CopyButton {
text: String,
},
}
#[derive(Serialize, Deserialize, Clone, PartialEq)]
pub struct Variant {
pub id: Option<String>,
pub name: String,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub color: Option<String>,
}