1use serde::Serialize;
2use serde_repr::Serialize_repr;
3
4#[derive(Serialize, Debug)]
8#[serde(untagged)]
9pub enum Repeat {
10 Bool(bool),
11 Integer(isize)
12}
13
14#[derive(Serialize_repr, Clone, Debug)]
15#[repr(u8)]
16pub enum Icon {
17 DragonTimer = 34,
18
19 None = 0,
20 HealthPlus = 1,
21 Armor = 2,
22 Ammo = 3,
23 Money = 4,
24 Explosion = 5,
25 Kill = 6,
26 Headshot = 7,
27 Helmet = 8,
28 Hunger = 10,
29 Air = 11,
30 Compass = 12,
31 Pickaxe = 13,
32 Potion = 14,
33 Clock = 15,
34 Lightning = 16,
35 Item = 17,
36 AtSymbol = 18,
37 Muted = 19,
38 Talking = 20,
39 Connect = 21,
40 Disconnect = 22,
41 Music = 23,
42 Play = 24,
43 Pause = 25,
44 Cpu = 27,
45 Gpu = 28,
46 Ram = 29,
47 Assist = 30,
48 Creep = 31,
49 Dead = 32,
50 Dragon = 33,
51 Enemy = 35,
52 Game = 36,
53 Gold = 37,
54 HealthHeart = 38,
55 Skull = 39,
56 Mana = 40,
57 Teammates = 41,
58 Timer = 42,
59 Temperature = 43,
60}
61
62#[derive(Serialize, Debug)]
63#[serde(rename_all = "kebab-case")]
64pub struct FrameModifiersData {
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub length_millis: Option<isize>,
67 #[serde(skip_serializing_if = "Option::is_none")]
68 pub icon_id: Option<Icon>,
69 #[serde(skip_serializing_if = "Option::is_none")]
70 pub repeats: Option<Repeat>
71}
72
73#[derive(Serialize, Debug)]
74#[serde(rename_all = "kebab-case")]
75pub struct DataAccessorData {
76 #[serde(skip_serializing_if = "Option::is_none")]
77 pub arg: Option<String>,
78 #[serde(skip_serializing_if = "Option::is_none")]
79 pub context_frame_key: Option<String>
80}
81
82
83#[derive(Serialize, Debug)]
84#[serde(rename_all = "kebab-case")]
85pub struct TextModifiersData {
86 pub has_text: bool,
87 #[serde(skip_serializing_if = "Option::is_none")]
88 pub prefix: Option<String>,
89 #[serde(skip_serializing_if = "Option::is_none")]
90 pub suffix: Option<String>,
91 #[serde(skip_serializing_if = "Option::is_none")]
92 pub bold: Option<bool>,
93 #[serde(skip_serializing_if = "Option::is_none")]
94 pub wrap: Option<isize>
95}
96
97#[derive(Serialize, Debug)]
98#[serde(rename_all = "kebab-case")]
99pub struct ProgressBarData {
100 pub has_progress_bar: bool
101}
102
103#[derive(Serialize, Debug)]
104#[serde(untagged)]
105pub enum LineDataType {
106 TextModifiersData(TextModifiersData),
107 ProgressBarData(ProgressBarData)
108}
109
110
111#[derive(Serialize, Debug)]
112pub struct LineData {
113 #[serde(flatten)]
114 pub type_options: LineDataType,
115 #[serde(flatten)]
116 #[serde(skip_serializing_if = "Option::is_none")]
117 pub data_accessor_data: Option<DataAccessorData>
118}
119
120
121#[derive(Serialize, Debug)]
122pub struct SingleLineFrameData {
123 #[serde(flatten)]
124 #[serde(skip_serializing_if = "Option::is_none")]
125 pub frame_modifiers_data: Option<FrameModifiersData>,
126 #[serde(flatten)]
127 pub line: LineData
128}
129
130#[derive(Serialize, Debug)]
131#[serde(rename_all = "kebab-case")]
132pub struct MultiLineFrameData {
133 #[serde(flatten)]
134 #[serde(skip_serializing_if = "Option::is_none")]
135 pub frame_modifiers_data: Option<FrameModifiersData>,
136 pub lines: Vec<LineData>
137}
138
139#[derive(Serialize, Debug)]
140#[serde(rename_all = "kebab-case")]
141pub struct ImageFrameData {
142 pub has_text: bool,
144 #[serde(flatten)]
145 #[serde(skip_serializing_if = "Option::is_none")]
146 pub frame_modifiers_data: Option<FrameModifiersData>,
147 pub image_data: Vec<u8>
148}
149
150#[derive(Serialize, Debug)]
151#[serde(untagged)]
152pub enum ScreenFrameData {
153 SingleLineFrameData(SingleLineFrameData),
154 MultiLineFrameData(MultiLineFrameData),
155 ImageFrameData(ImageFrameData)
156}
157
158
159#[derive(Serialize, Debug)]
160pub struct StaticScreenDataDefinition(pub Vec<ScreenFrameData>);
161
162#[derive(Serialize, Debug)]
163#[serde(rename_all = "kebab-case")]
164pub struct RangeScreenDataDefintion {
165 pub low: isize,
166 pub high: isize,
167 pub datas: StaticScreenDataDefinition
168}
169
170#[derive(Serialize, Debug)]
171#[serde(untagged)]
172pub enum ScreenDataDefinition {
173 StaticScreenDataDefinition(StaticScreenDataDefinition),
174 RangeScreenDataDefintion(RangeScreenDataDefintion)
175}
176
177#[derive(Serialize, Debug)]
178#[serde(rename_all = "kebab-case")]
179pub struct ScreenHandler {
180 pub device_type: String,
181 pub zone: String,
182 mode: String,
183 pub datas: ScreenDataDefinition
184}
185
186impl ScreenHandler {
187 pub fn new(device_type: &str, zone: &str, datas: ScreenDataDefinition) -> ScreenHandler {
188 ScreenHandler {
189 device_type: device_type.to_owned(),
190 zone: zone.to_owned(),
191 mode: String::from("screen"),
192 datas: datas
193 }
194 }
195}