gamesense/handler/
screen.rs

1use serde::Serialize;
2use serde_repr::Serialize_repr;
3
4// Reference: https://github.com/SteelSeries/gamesense-sdk/blob/master/doc/api/json-handlers-screen.md
5
6
7#[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    // Undocumented but required
143    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}