tanoshi_lib/models/
input.rs1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
4pub enum TriState {
5 Ignored = 0,
6 Included = 1,
7 Excluded = 2,
8}
9
10impl Default for TriState {
11 fn default() -> Self {
12 Self::Ignored
13 }
14}
15
16#[derive(Debug, Clone, Deserialize, Serialize)]
17pub enum InputType {
18 String(String),
19 Number(f64),
20 Boolean(bool),
21}
22
23impl From<String> for InputType {
24 fn from(s: String) -> Self {
25 Self::String(s)
26 }
27}
28
29impl From<&str> for InputType {
30 fn from(s: &str) -> Self {
31 Self::String(s.to_string())
32 }
33}
34
35impl From<f64> for InputType {
36 fn from(n: f64) -> Self {
37 Self::Number(n)
38 }
39}
40
41impl From<bool> for InputType {
42 fn from(b: bool) -> Self {
43 Self::Boolean(b)
44 }
45}
46
47#[derive(Debug, Clone, Deserialize, Serialize)]
48pub enum Input {
49 Text {
50 name: String,
51 state: Option<String>,
52 },
53 Checkbox {
54 name: String,
55 state: Option<bool>,
56 },
57 Select {
58 name: String,
59 values: Vec<InputType>,
60 state: Option<i64>,
61 },
62 Group {
63 name: String,
64 state: Vec<Input>,
65 },
66 Sort {
67 name: String,
68 values: Vec<InputType>,
69 selection: Option<(i64, bool)>,
70 },
71 State {
72 name: String,
73 selected: Option<TriState>,
74 },
75}
76
77impl Input {
78 pub fn name(&self) -> String {
79 match self {
80 Input::Text { name, .. } => name.clone(),
81 Input::Checkbox { name, .. } => name.clone(),
82 Input::Select { name, .. } => name.clone(),
83 Input::Group { name, .. } => name.clone(),
84 Input::Sort { name, .. } => name.clone(),
85 Input::State { name, .. } => name.clone(),
86 }
87 }
88}
89
90impl PartialEq for Input {
91 fn eq(&self, other: &Self) -> bool {
92 match (self, other) {
93 (Self::Text { name: l_name, .. }, Self::Text { name: r_name, .. }) => l_name == r_name,
94 (Self::Checkbox { name: l_name, .. }, Self::Checkbox { name: r_name, .. }) => {
95 l_name == r_name
96 }
97 (Self::Select { name: l_name, .. }, Self::Select { name: r_name, .. }) => {
98 l_name == r_name
99 }
100 (Self::Group { name: l_name, .. }, Self::Group { name: r_name, .. }) => {
101 l_name == r_name
102 }
103 (Self::Sort { name: l_name, .. }, Self::Sort { name: r_name, .. }) => l_name == r_name,
104 (Self::State { name: l_name, .. }, Self::State { name: r_name, .. }) => {
105 l_name == r_name
106 }
107 _ => false,
108 }
109 }
110}