poke_data/models/pokemon/
wild_item.rs1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::item::{Item, ItemId};
4use crate::models::version::VersionId;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7use std::sync::Arc;
8
9#[derive(Debug)]
10pub struct PokemonWildItems(HashMap<VersionId, Vec<PokemonWildItem>>);
11
12#[derive(Debug)]
13pub struct PokemonWildItem {
14 pub item: Arc<Item>,
15 pub rarity: u8,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
19pub struct UnlinkedPokemonWildItems(HashMap<VersionId, Vec<UnlinkedPokemonWildItem>>);
20
21impl UnlinkedPokemonWildItems {
22 pub fn new(items: HashMap<VersionId, Vec<UnlinkedPokemonWildItem>>) -> Self {
23 Self(items)
24 }
25}
26
27impl Linkable for UnlinkedPokemonWildItems {
28 type Linked = PokemonWildItems;
29
30 fn link(&self, context: &LinkContext) -> Self::Linked {
31 let items = self
32 .0
33 .iter()
34 .map(|(version_id, items)| {
35 (
36 *version_id,
37 items.iter().map(|item| item.link(context)).collect(),
38 )
39 })
40 .collect();
41 PokemonWildItems(items)
42 }
43}
44
45#[derive(Debug, Clone, Serialize, Deserialize)]
46pub struct UnlinkedPokemonWildItem {
47 pub item_id: ItemId,
48 pub rarity: u8,
49}
50
51impl Linkable for UnlinkedPokemonWildItem {
52 type Linked = PokemonWildItem;
53
54 fn link(&self, context: &LinkContext) -> Self::Linked {
55 let item = context
56 .items
57 .get(&self.item_id)
58 .unwrap_or_else(|| {
59 panic!(
60 "No item '{}' found for pokemon wild held item",
61 self.item_id
62 )
63 })
64 .clone();
65
66 PokemonWildItem {
67 item,
68 rarity: self.rarity,
69 }
70 }
71}