1use serde::{Deserialize, Serialize};
2use strum::{EnumIter, IntoStaticStr};
3
4type Code = u16;
5type Parameters = Vec<Parameter>;
6
7#[derive(Deserialize, Serialize, Clone, Debug)]
8pub struct CommandDescription {
9 pub code: Code,
11 pub name: String,
13 #[serde(default)]
16 pub description: String,
17 #[serde(default)]
19 pub kind: CommandKind,
20 #[serde(default)]
22 pub hidden: bool,
23
24 #[serde(default)]
26 pub lumi_text: String,
27
28 #[serde(skip)]
32 #[serde(default = "rand::random")]
33 pub guid: u64,
34}
35
36impl CommandDescription {
37 pub fn parameter_count(&self) -> u8 {
39 match self.kind {
40 CommandKind::Branch { ref parameters, .. } | CommandKind::Single(ref parameters) => {
41 parameters.len() as u8
42 + parameters
43 .iter()
44 .map(Parameter::parameter_count)
45 .sum::<u8>()
46 }
47 CommandKind::Multi { .. } => 1,
48 }
49 }
50}
51
52impl Default for CommandDescription {
53 fn default() -> Self {
54 CommandDescription {
55 code: 0,
56 name: "New Command".to_string(),
57 description: "".to_string(),
58 kind: CommandKind::default(),
59 hidden: false,
60 lumi_text: "".to_string(),
61 guid: rand::random(),
62 }
63 }
64}
65
66#[derive(Deserialize, Serialize, Clone, Debug, EnumIter, IntoStaticStr)]
67pub enum CommandKind {
68 Branch {
72 end_code: Code,
73 parameters: Parameters,
74 },
75 Multi { code: Code, highlight: bool },
79 Single(Parameters),
81}
82
83impl Default for CommandKind {
84 fn default() -> Self {
85 CommandKind::Single(vec![])
86 }
87}
88
89impl PartialEq for CommandKind {
91 fn eq(&self, other: &Self) -> bool {
92 std::mem::discriminant(self) == std::mem::discriminant(other)
93 }
94}
95
96#[derive(Deserialize, Serialize, Clone, Debug, Default, EnumIter, IntoStaticStr)]
97pub enum Parameter {
98 Selection {
99 #[serde(default)]
101 index: Index,
102 parameters: Vec<(i8, Parameter)>,
106
107 #[serde(skip)]
109 #[serde(default = "rand::random")]
110 guid: u64,
111 },
112 Group {
113 parameters: Parameters,
115
116 #[serde(skip)]
118 #[serde(default = "rand::random")]
119 guid: u64,
120 },
121 Single {
122 #[serde(default)]
124 index: Index,
125 description: String,
127 name: String,
129 kind: ParameterKind,
131
132 #[serde(skip)]
134 #[serde(default = "rand::random")]
135 guid: u64,
136 },
137
138 #[default]
140 Dummy,
141
142 Label(String),
144}
145
146#[derive(Deserialize, Serialize, Debug, Clone, Copy, PartialEq, Eq)]
147pub enum Index {
148 Assumed(u8),
158 Overridden(u8),
160}
161
162impl Index {
163 pub fn as_u8(self) -> u8 {
165 match self {
166 Self::Assumed(i) | Self::Overridden(i) => i,
167 }
168 }
169
170 pub fn as_usize(self) -> usize {
171 self.as_u8() as usize
172 }
173}
174
175impl Default for Index {
176 fn default() -> Self {
177 Self::Assumed(0)
178 }
179}
180
181impl PartialEq for Parameter {
182 fn eq(&self, other: &Self) -> bool {
183 std::mem::discriminant(self) == std::mem::discriminant(other)
184 }
185}
186
187impl Parameter {
188 pub fn parameter_count(&self) -> u8 {
189 match self {
190 Self::Group { ref parameters, .. } => {
191 parameters.len() as u8
192 + parameters
193 .iter()
194 .map(Parameter::parameter_count)
195 .sum::<u8>()
196 }
197 Self::Selection { ref parameters, .. } => {
198 parameters.len() as u8
199 + parameters
200 .iter()
201 .map(|(_, p)| p)
202 .map(Parameter::parameter_count)
203 .sum::<u8>()
204 }
205 _ => 0,
206 }
207 }
208}
209
210#[derive(Deserialize, Serialize, Clone, Debug, EnumIter, IntoStaticStr, Default)]
211pub enum ParameterKind {
212 Switch,
214 Variable,
216 SelfSwitch,
218
219 String,
221
222 #[default]
224 Int,
225 IntBool,
227
228 Enum { variants: Vec<(String, i8)> },
232}
233
234impl PartialEq for ParameterKind {
235 fn eq(&self, other: &Self) -> bool {
236 std::mem::discriminant(self) == std::mem::discriminant(other)
237 }
238}