tanoshi_lib/models/
input.rs

1use 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}