1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
use crate::data::RoomName;
with_resource_fields_and_update_struct! {
{
::websocket::types::room::resources::ResourceType;
Energy => energy => "energy"
=> Some(::websocket::types::room::resources::ResourceType::Power);
Power => power => "power"
=> Some(::websocket::types::room::resources::ResourceType::Hydrogen);
Hydrogen => hydrogen => "H"
=> Some(::websocket::types::room::resources::ResourceType::Oxygen);
Oxygen => oxygen => "O"
=> Some(::websocket::types::room::resources::ResourceType::Utrium);
Utrium => utrium => "U"
=> Some(::websocket::types::room::resources::ResourceType::Lemergium);
Lemergium => lemergium => "L"
=> Some(::websocket::types::room::resources::ResourceType::Keanium);
Keanium => keanium => "K"
=> Some(::websocket::types::room::resources::ResourceType::Zynthium);
Zynthium => zynthium => "Z"
=> Some(::websocket::types::room::resources::ResourceType::Catalyst);
Catalyst => catalyst => "X"
=> Some(::websocket::types::room::resources::ResourceType::Ghodium);
Ghodium => ghodium => "G"
=> Some(::websocket::types::room::resources::ResourceType::Hydroxide);
Hydroxide => hydroxide => "OH"
=> Some(::websocket::types::room::resources::ResourceType::ZynthiumKeanite);
ZynthiumKeanite => zynthium_keanite => "ZK"
=> Some(::websocket::types::room::resources::ResourceType::UtriumLemergite);
UtriumLemergite => utrium_lemergite => "UL"
=> Some(::websocket::types::room::resources::ResourceType::UtriumHydride);
UtriumHydride => utrium_hydride => "UH"
=> Some(::websocket::types::room::resources::ResourceType::UtriumOxide);
UtriumOxide => utrium_oxide => "UO"
=> Some(::websocket::types::room::resources::ResourceType::KeaniumHydride);
KeaniumHydride => keanium_hydride => "KH"
=> Some(::websocket::types::room::resources::ResourceType::KeaniumOxide);
KeaniumOxide => keanium_oxide => "KO"
=> Some(::websocket::types::room::resources::ResourceType::LemergiumHydride);
LemergiumHydride => lemergium_hydride => "LH"
=> Some(::websocket::types::room::resources::ResourceType::LemergiumOxide);
LemergiumOxide => lemergium_oxide => "LO"
=> Some(::websocket::types::room::resources::ResourceType::ZynthiumHydride);
ZynthiumHydride => zynthium_hydride => "ZH"
=> Some(::websocket::types::room::resources::ResourceType::ZynthiumOxide);
ZynthiumOxide => zynthium_oxide => "ZO"
=> Some(::websocket::types::room::resources::ResourceType::GhodiumHydride);
GhodiumHydride => ghodium_hydride => "GH"
=> Some(::websocket::types::room::resources::ResourceType::GhodiumOxide);
GhodiumOxide => ghodium_oxide => "GO"
=> Some(::websocket::types::room::resources::ResourceType::UtriumAcid);
UtriumAcid => utrium_acid => "UH2O"
=> Some(::websocket::types::room::resources::ResourceType::UtriumAlkalide);
UtriumAlkalide => utrium_alkalide => "UHO2"
=> Some(::websocket::types::room::resources::ResourceType::KeaniumAcid);
KeaniumAcid => keanium_acid => "KH2O"
=> Some(::websocket::types::room::resources::ResourceType::KeaniumAlkalide);
KeaniumAlkalide => keanium_alkalide => "KHO2"
=> Some(::websocket::types::room::resources::ResourceType::LemergiumAcid);
LemergiumAcid => lemergium_acid => "LH2O"
=> Some(::websocket::types::room::resources::ResourceType::LemergiumAlkalide);
LemergiumAlkalide => lemergium_alkalide => "LHO2"
=> Some(::websocket::types::room::resources::ResourceType::ZynthiumAcid);
ZynthiumAcid => zynthium_acid => "ZH2O"
=> Some(::websocket::types::room::resources::ResourceType::ZynthiumAlkalide);
ZynthiumAlkalide => zynthium_alkalide => "ZHO2"
=> Some(::websocket::types::room::resources::ResourceType::GhodiumAcid);
GhodiumAcid => ghodium_acid => "GH2O"
=> Some(::websocket::types::room::resources::ResourceType::GhodiumAlkalide);
GhodiumAlkalide => ghodium_alkalide => "GHO2"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedUtriumAcid);
CatalyzedUtriumAcid => catalyzed_utrium_acid => "XUH2O"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedUtriumAlkalide);
CatalyzedUtriumAlkalide => catalyzed_utrium_alkalide => "XUHO2"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAcid);
CatalyzedKeaniumAcid => catalyzed_keanium_acid => "XKH2O"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAlkalide);
CatalyzedKeaniumAlkalide => catalyzed_keanium_alkalide => "XKHO2"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAcid);
CatalyzedLemergiumAcid => catalyzed_lemergium_acid => "XLH2O"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAlkalide);
CatalyzedLemergiumAlkalide => catalyzed_lemergium_alkalide => "XLHO2"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAcid);
CatalyzedZynthiumAcid => catalyzed_zynthium_acid => "XZH2O"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAlkalide);
CatalyzedZynthiumAlkalide => catalyzed_zynthium_alkalide => "XZHO2"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAcid);
CatalyzedGhodiumAcid => catalyzed_ghodium_acid => "XGH2O"
=> Some(::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAlkalide);
CatalyzedGhodiumAlkalide => catalyzed_ghodium_alkalide => "XGHO2"
=> None;
}
#[derive(Clone, Debug, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct StructureContainer {
#[serde(default)]
pub hits: i32,
#[serde(default)]
pub hits_max: i32,
#[serde(rename = "energyCapacity")]
pub capacity: i32,
pub next_decay_time: u32,
pub notify_when_attacked: bool,
}
#[derive(Clone, Debug)]
#[serde(rename_all = "camelCase")]
pub struct StructureContainerUpdate {
- hits: i32,
- hits_max: i32,
#[serde(rename = "energyCapacity")]
- capacity: i32,
- next_decay_time: u32,
- notify_when_attacked: bool,
}
}
resource_iterator_for! {
{
crate::websocket::types::room::resources::ResourceType;
Energy => energy => "energy"
=> Some(crate::websocket::types::room::resources::ResourceType::Power);
Power => power => "power"
=> Some(crate::websocket::types::room::resources::ResourceType::Hydrogen);
Hydrogen => hydrogen => "H"
=> Some(crate::websocket::types::room::resources::ResourceType::Oxygen);
Oxygen => oxygen => "O"
=> Some(crate::websocket::types::room::resources::ResourceType::Utrium);
Utrium => utrium => "U"
=> Some(crate::websocket::types::room::resources::ResourceType::Lemergium);
Lemergium => lemergium => "L"
=> Some(crate::websocket::types::room::resources::ResourceType::Keanium);
Keanium => keanium => "K"
=> Some(crate::websocket::types::room::resources::ResourceType::Zynthium);
Zynthium => zynthium => "Z"
=> Some(crate::websocket::types::room::resources::ResourceType::Catalyst);
Catalyst => catalyst => "X"
=> Some(crate::websocket::types::room::resources::ResourceType::Ghodium);
Ghodium => ghodium => "G"
=> Some(crate::websocket::types::room::resources::ResourceType::Hydroxide);
Hydroxide => hydroxide => "OH"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumKeanite);
ZynthiumKeanite => zynthium_keanite => "ZK"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumLemergite);
UtriumLemergite => utrium_lemergite => "UL"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumHydride);
UtriumHydride => utrium_hydride => "UH"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumOxide);
UtriumOxide => utrium_oxide => "UO"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumHydride);
KeaniumHydride => keanium_hydride => "KH"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumOxide);
KeaniumOxide => keanium_oxide => "KO"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumHydride);
LemergiumHydride => lemergium_hydride => "LH"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumOxide);
LemergiumOxide => lemergium_oxide => "LO"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumHydride);
ZynthiumHydride => zynthium_hydride => "ZH"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumOxide);
ZynthiumOxide => zynthium_oxide => "ZO"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumHydride);
GhodiumHydride => ghodium_hydride => "GH"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumOxide);
GhodiumOxide => ghodium_oxide => "GO"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumAcid);
UtriumAcid => utrium_acid => "UH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::UtriumAlkalide);
UtriumAlkalide => utrium_alkalide => "UHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumAcid);
KeaniumAcid => keanium_acid => "KH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::KeaniumAlkalide);
KeaniumAlkalide => keanium_alkalide => "KHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumAcid);
LemergiumAcid => lemergium_acid => "LH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::LemergiumAlkalide);
LemergiumAlkalide => lemergium_alkalide => "LHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumAcid);
ZynthiumAcid => zynthium_acid => "ZH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::ZynthiumAlkalide);
ZynthiumAlkalide => zynthium_alkalide => "ZHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumAcid);
GhodiumAcid => ghodium_acid => "GH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::GhodiumAlkalide);
GhodiumAlkalide => ghodium_alkalide => "GHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedUtriumAcid);
CatalyzedUtriumAcid => catalyzed_utrium_acid => "XUH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedUtriumAlkalide);
CatalyzedUtriumAlkalide => catalyzed_utrium_alkalide => "XUHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAcid);
CatalyzedKeaniumAcid => catalyzed_keanium_acid => "XKH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedKeaniumAlkalide);
CatalyzedKeaniumAlkalide => catalyzed_keanium_alkalide => "XKHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAcid);
CatalyzedLemergiumAcid => catalyzed_lemergium_acid => "XLH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedLemergiumAlkalide);
CatalyzedLemergiumAlkalide => catalyzed_lemergium_alkalide => "XLHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAcid);
CatalyzedZynthiumAcid => catalyzed_zynthium_acid => "XZH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedZynthiumAlkalide);
CatalyzedZynthiumAlkalide => catalyzed_zynthium_alkalide => "XZHO2"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAcid);
CatalyzedGhodiumAcid => catalyzed_ghodium_acid => "XGH2O"
=> Some(crate::websocket::types::room::resources::ResourceType::CatalyzedGhodiumAlkalide);
CatalyzedGhodiumAlkalide => catalyzed_ghodium_alkalide => "XGHO2"
=> None;
}
#[derive(Debug)]
pub struct ContainerContents(StructureContainer);
}
impl StructureContainer {
pub fn resources(&self) -> ContainerContents {
ContainerContents::new(self)
}
}
#[cfg(test)]
mod test {
use serde::Deserialize;
use super::StructureContainer;
use crate::websocket::types::room::resources::ResourceType;
#[test]
fn parse_container() {
let json = json!({
"_id": "58cc8143050a8f701678f22e",
"energy": 2000,
"energyCapacity": 2000,
"hits": 250000,
"hitsMax": 250000,
"nextDecayTime": 20233841,
"notifyWhenAttacked": true,
"room": "E9N23",
"type": "container",
"x": 19,
"y": 22
});
let obj = StructureContainer::deserialize(json).unwrap();
match obj {
StructureContainer {
ghodium_oxide: 0,
keanium_oxide: 0,
oxygen: 0,
keanium: 0,
energy: 2000,
capacity: 2000,
hits: 250000,
hits_max: 250000,
next_decay_time: 20233841,
notify_when_attacked: true,
x: 19,
y: 22,
ref id,
..
} if id == "58cc8143050a8f701678f22e" => (),
other => panic!(
"expected pre-set StructureContainer to match, found {:#?}",
other
),
}
assert_eq!(
{
let mut contents = obj.resources().collect::<Vec<_>>();
contents.sort();
contents
},
{
let mut expected = vec![(ResourceType::Energy, 2000)];
expected.sort();
expected
}
);
}
}