poke_data/models/pokemon/
wild_item.rs

1use 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}