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
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
use QueueType;
use serde::de;
use std::collections::HashMap;
use std::fmt;

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChampionMastery {
	#[serde(default)] pub chest_granted: bool,
	#[serde(default)] pub champion_level: i32,
	#[serde(default)] pub champion_points: i32,
	#[serde(default)] pub champion_id: i64,
	#[serde(default)] pub player_id: i64,
	#[serde(default)] pub champion_points_until_next_level: i64,
	#[serde(default)] pub champion_points_since_last_level: i64,
	#[serde(default)] pub last_play_time: i64,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LeagueList {
	#[serde(default)] pub tier: String,
	pub queue: QueueType,
	#[serde(default)] pub name: String,
	#[serde(default)] pub entries: Vec<LeaguePosition>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LeaguePosition {
	pub queue_type: Option<QueueType>,
	#[serde(default)] pub rank: String,
	#[serde(default)] pub hot_streak: bool,
	pub mini_series: Option<MiniSeries>,
	#[serde(default)] pub wins: i32,
	#[serde(default)] pub veteran: bool,
	#[serde(default)] pub losses: i32,
	#[serde(default)] pub fresh_blood: bool,
	#[serde(default)] pub player_or_team_name: String,
	#[serde(default)] pub inactive: bool,
	#[serde(default)] pub player_or_team_id: String,
	#[serde(default)] pub league_points: i32,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MiniSeries {
	#[serde(default)] pub wins: i32,
	#[serde(default)] pub losses: i32,
	#[serde(default)] pub target: i32,
	#[serde(default)] pub progress: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChampionListDynamic {
	#[serde(default)] pub champions: Vec<ChampionDynamic>,
}

#[derive(Clone, Copy, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChampionDynamic {
	#[serde(default)] pub ranked_play_enabled: bool,
	#[serde(default)] pub bot_enabled: bool,
	#[serde(default)] pub bot_mm_enabled: bool,
	#[serde(default)] pub active: bool,
	#[serde(default)] pub free_to_play: bool,
	#[serde(default)] pub id: i64,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChampionListStatic {
	#[serde(default)] pub keys: HashMap<String, String>,
	#[serde(default)] pub data: HashMap<String, ChampionStatic>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub data_type: String,
	#[serde(default)] pub format: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChampionStatic {
	pub info: Option<Info>,
	#[serde(default)] pub enemytyps: Vec<String>,
	pub stats: Option<Stats>,
	#[serde(default)] pub name: String,
	#[serde(default)] pub title: String,
	pub image: Option<Image>,
	#[serde(default)] pub tags: Vec<String>,
	#[serde(default)] pub partype: String,
	#[serde(default)] pub skins: Vec<Skin>,
	pub passive: Option<Passive>,
	#[serde(default)] pub recommended: Vec<Recommended>,
	#[serde(default)] pub allytips: Vec<String>,
	#[serde(default)] pub key: String,
	#[serde(default)] pub lore: String,
	#[serde(default)] pub id: i32,
	#[serde(default)] pub blurb: String,
	#[serde(default)] pub spells: Vec<ChampionSpell>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Info {
	#[serde(default)] pub difficulty: i32,
	#[serde(default)] pub attack: i32,
	#[serde(default)] pub defense: i32,
	#[serde(default)] pub magic: i32,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Stats {
	#[serde(default)] pub armorperlevel: f64,
	#[serde(default)] pub hpperlevel: f64,
	#[serde(default)] pub attackdamage: f64,
	#[serde(default)] pub mpperlevel: f64,
	#[serde(default)] pub attackspeedoffset: f64,
	#[serde(default)] pub armor: f64,
	#[serde(default)] pub hp: f64,
	#[serde(default)] pub hpregenperlevel: f64,
	#[serde(default)] pub spellblock: f64,
	#[serde(default)] pub attackrange: f64,
	#[serde(default)] pub movespeed: f64,
	#[serde(default)] pub attackdamageperlevel: f64,
	#[serde(default)] pub mpregenperlevel: f64,
	#[serde(default)] pub mp: f64,
	#[serde(default)] pub spellblockperlevel: f64,
	#[serde(default)] pub crit: f64,
	#[serde(default)] pub mpregen: f64,
	#[serde(default)] pub attackspeedperlevel: f64,
	#[serde(default)] pub hpregen: f64,
	#[serde(default)] pub critperlevel: f64,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Image {
	#[serde(default)] pub full: String,
	#[serde(default)] pub group: String,
	#[serde(default)] pub sprite: String,
	#[serde(default)] pub h: i32,
	#[serde(default)] pub w: i32,
	#[serde(default)] pub y: i32,
	#[serde(default)] pub x: i32,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Skin {
	#[serde(default)] pub num: i32,
	#[serde(default)] pub name: String,
	#[serde(default)] pub id: i32,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Passive {
	pub image: Image,
	#[serde(default)] pub sanitized_description: String,
	#[serde(default)] pub name: String,
	#[serde(default)] pub description: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Recommended {
	#[serde(default)] pub map: String,
	#[serde(default)] pub blocks: Vec<Block>,
	#[serde(default)] pub champion: String,
	#[serde(default)] pub title: String,
	#[serde(default)] pub priority: bool,
	#[serde(default)] pub mode: String,
	#[serde(default)] pub blocks_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Block {
	#[serde(default)] pub items: Vec<BlockItem>,
	#[serde(default)] pub rec_math: bool,
	#[serde(default)] pub items_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BlockItem {
	#[serde(default)] pub count: i32,
	#[serde(default)] pub id: i32,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ChampionSpell {
	#[serde(default)] pub cooldown_burn: String,
	#[serde(default)] pub resource: String,
	pub leveltip: LevelTip,
	#[serde(default)] pub vars: Vec<SpellVars>,
	#[serde(default)] pub cost_type: String,
	pub image: Image,
	#[serde(default)] pub sanitized_description: String,
	#[serde(default)] pub sanitized_tooltip: String,
	#[serde(default)] pub effect: Vec<Vec<f64>>,
	#[serde(default)] pub tooltip: String,
	#[serde(default)] pub maxrank: i32,
	#[serde(default)] pub cost_burn: String,
	#[serde(default)] pub range_burn: String,
	pub range: Option<Range>,
	#[serde(default)] pub cooldown: Vec<f64>,
	#[serde(default)] pub cost: Vec<i32>,
	#[serde(default)] pub key: String,
	#[serde(default)] pub description: String,
	#[serde(default)] pub effect_burn: Vec<String>,
	#[serde(default)] pub altimages: Vec<Image>,
	#[serde(default)] pub name: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LevelTip {
	#[serde(default)] pub effect: Vec<String>,
	#[serde(default)] pub label: Vec<String>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpellVars {
	#[serde(default)] pub ranks_with: String,
	#[serde(default)] pub dyn: String,
	#[serde(default)] pub link: String,
	#[serde(default)] pub coeff: Vec<f64>,
	#[serde(default)] pub key: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ItemList {
	#[serde(default)] pub data: HashMap<String, Item>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub tree: Vec<ItemTree>,
	#[serde(default)] pub groups: Vec<Group>,
	#[serde(default)] pub items_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ItemTree {
	#[serde(default)] pub header: String,
	#[serde(default)] pub tags: Vec<String>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Item {
	pub gold: Option<Gold>,
	#[serde(default)] pub plaintext: String,
	#[serde(default)] pub hide_from_all: bool,
	#[serde(default)] pub in_store: bool,
	#[serde(default)] pub into: Vec<String>,
	#[serde(default)] pub id: i32,
	pub stats: Option<InventoryDataStats>,
	#[serde(default)] pub colloq: String,
	#[serde(default)] pub maps: HashMap<String, bool>,
	#[serde(default)] pub special_recipe: i32,
	pub image: Option<Image>,
	#[serde(default)] pub description: String,
	#[serde(default)] pub tags: Vec<String>,
	#[serde(default)] pub effect: HashMap<String, String>,
	#[serde(default)] pub required_champion: String,
	#[serde(default)] pub from: Vec<String>,
	#[serde(default)] pub group: String,
	#[serde(default)] pub consume_on_full: bool,
	#[serde(default)] pub name: String,
	#[serde(default)] pub consumed: bool,
	#[serde(default)] pub sanitized_description: String,
	#[serde(default)] pub depth: i32,
	#[serde(default)] pub stacks: i32,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Gold {
	#[serde(default)] pub sell: i32,
	#[serde(default)] pub total: i32,
	#[serde(default)] pub base: i32,
	#[serde(default)] pub purchasable: bool,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InventoryDataStats {
	#[serde(default)] pub percent_crit_damage_mod: f64,
	#[serde(default)] pub percent_spell_block_mod: f64,
	#[serde(default)] pub percent_hp_regen_mod: f64,
	#[serde(default)] pub percent_movement_speed_mod: f64,
	#[serde(default)] pub flat_spell_block_mod: f64,
	#[serde(default)] pub flat_crit_damage_mod: f64,
	#[serde(default)] pub flat_energy_pool_mod: f64,
	#[serde(default)] pub percent_life_steal_mod: f64,
	#[serde(default)] pub flat_mp_pool_mod: f64,
	#[serde(default)] pub flat_movement_speed_mod: f64,
	#[serde(default)] pub percent_attack_speed_mod: f64,
	#[serde(default)] pub flat_block_mod: f64,
	#[serde(default)] pub percent_block_mod: f64,
	#[serde(default)] pub flat_energy_regen_mod: f64,
	#[serde(default)] pub percent_spell_vamp_mod: f64,
	#[serde(default)] pub flat_mp_regen_mod: f64,
	#[serde(default)] pub percent_dodge_mod: f64,
	#[serde(default)] pub flat_attack_speed_mod: f64,
	#[serde(default)] pub flat_armor_mod: f64,
	#[serde(default)] pub flat_hp_regen_mod: f64,
	#[serde(default)] pub percent_magic_damage_mod: f64,
	#[serde(default)] pub percent_mp_pool_mod: f64,
	#[serde(default)] pub flat_magic_damage_mod: f64,
	#[serde(default)] pub percent_mp_regen_mod: f64,
	#[serde(default)] pub percent_physical_damage_mod: f64,
	#[serde(default)] pub flat_physical_damage_mod: f64,
	#[serde(default)] pub percent_hp_pool_mod: f64,
	#[serde(default)] pub percent_armor_mod: f64,
	#[serde(default)] pub percent_crit_chance_mod: f64,
	#[serde(default)] pub percent_exp_bonus: f64,
	#[serde(default)] pub flat_hp_pool_mod: f64,
	#[serde(default)] pub flat_crit_chance_mod: f64,
	#[serde(default)] pub flat_exp_bonus: f64,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Group {
	#[serde(default)] pub max_group_ownable: String,
	#[serde(default)] pub key: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LanguageStrings {
	#[serde(default)] pub data: HashMap<String, String>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub strings_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MapData {
	#[serde(default)] pub data: HashMap<String, MapDetails>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub data_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MapDetails {
	#[serde(default)] pub map_name: String,
	pub image: Option<Image>,
	#[serde(default)] pub map_id: i64,
	#[serde(default)] pub unpurchasable_item_list: Vec<i64>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MasteryList {
	#[serde(default)] pub data: HashMap<String, Mastery>,
	#[serde(default)] pub version: String,
	pub tree: Option<MasteryTree>,
	#[serde(default)] pub masteries_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MasteryTree {
	#[serde(default)] pub resolve: Vec<MasteryTreeList>,
	#[serde(default)] pub ferocity: Vec<MasteryTreeList>,
	#[serde(default)] pub cunning: Vec<MasteryTreeList>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MasteryTreeList {
	#[serde(default)] pub mastery_tree_items: Vec<MasteryTreeItem>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MasteryTreeItem {
	#[serde(default)] pub mastery_id: i32,
	#[serde(default)] pub prereq: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Mastery {
	#[serde(default)] pub prereq: String,
	#[serde(default)] pub mastery_tree: String,
	#[serde(default)] pub name: String,
	#[serde(default)] pub ranks: i32,
	pub image: Option<Image>,
	#[serde(default)] pub sanitized_description: Vec<String>,
	#[serde(default)] pub id: i32,
	#[serde(default)] pub description: Vec<String>,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProfileIconData {
	#[serde(default)] pub data: HashMap<String, ProfileIconDetails>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub data_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProfileIconDetails {
	pub image: Image,
	#[serde(default)] pub id: i64,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Realm {
	#[serde(default)] pub lg: String,
	#[serde(default)] pub dd: String,
	#[serde(default)] pub l: String,
	#[serde(default)] pub n: HashMap<String, String>,
	#[serde(default)] pub profileiconmax: i32,
	#[serde(default)] pub store: String,
	#[serde(default)] pub v: String,
	#[serde(default)] pub cdn: String,
	#[serde(default)] pub css: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RuneList {
	#[serde(default)] pub data: HashMap<String, Rune>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub data_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Rune {
	#[serde(default)] pub stats: HashMap<String, f64>,
	#[serde(default)] pub name: String,
	#[serde(default)] pub tags: Vec<String>,
	pub image: Option<Image>,
	#[serde(default)] pub sanitized_description: String,
	pub rune: MetaData,
	#[serde(default)] pub id: i32,
	#[serde(default)] pub description: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct MetaData {
	#[serde(default)] pub tier: String,
	#[serde(default)] pub rune_type: String,
	#[serde(default)] pub is_rune: bool,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SummonerSpellList {
	#[serde(default)] pub data: HashMap<String, SummonerSpell>,
	#[serde(default)] pub version: String,
	#[serde(default)] pub data_type: String,
}

#[derive(Clone, Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SummonerSpell {
	#[serde(default)] pub vars: Vec<SpellVars>,
	pub image: Option<Image>,
	#[serde(default)] pub cost_burn: String,
	#[serde(default)] pub cooldown: Vec<f64>,
	#[serde(default)] pub effect_burn: Vec<String>,
	#[serde(default)] pub id: i32,
	#[serde(default)] pub cooldown_burn: String,
	#[serde(default)] pub tooltip: String,
	#[serde(default)] pub maxrank: i32,
	#[serde(default)] pub range_burn: String,
	#[serde(default)] pub description: String,
	#[serde(default)] pub effect: Vec<Vec<f64>>,
	#[serde(default)] pub key: String,
	pub leveltip: Option<LevelTip>,
	#[serde(default)] pub modes: Vec<String>,
	#[serde(default)] pub resource: String,
	#[serde(default)] pub name: String,
	#[serde(default)] pub cost_type: String,
	#[serde(default)] pub sanitized_description: String,
	#[serde(default)] pub sanitized_tooltip: String,
	pub range: Option<Range>,
	#[serde(default)] pub cost: Vec<i32>,
	#[serde(default)] pub summoner_level: i32,
}

#[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub enum Range {
	SelfTarget,
	Range(Vec<i32>),
}
impl<'de> de::Deserialize<'de> for Range {
	fn deserialize<D: de::Deserializer<'de>>(deserializer: D) -> Result<Range, D::Error> {
		struct RangeVisitor;
		impl<'de> de::Visitor<'de> for RangeVisitor {
			type Value = Range;

			fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
				formatter.write_str("string \"self\" or list of integers")
			}

			fn visit_seq<V>(self, mut seq: V) -> Result<Range, V::Error>
				where V: de::SeqAccess<'de>
			{
				let mut ranges = Vec::with_capacity(seq.size_hint().unwrap_or(0));
				while let Some(r) = seq.next_element()? {
					ranges.push(r);
				}
				Ok(Range::Range(ranges))
			}

			fn visit_str<E: de::Error>(self, value: &str) -> Result<Range, E> {
				match value {
					"self" => Ok(Range::SelfTarget),
					_ => Err(de::Error::invalid_value(de::Unexpected::Str(value), &self)),
				}
			}
		}

		deserializer.deserialize_str(RangeVisitor)
	}
}