gw2lib_model/authenticated/account/
wallet.rs

1use std::{
2    collections::HashMap,
3    ops::{Deref, DerefMut},
4};
5
6use serde::{Deserialize, Serialize};
7
8use crate::{misc::currencies::CurrencyId, Endpoint, FixedEndpoint};
9
10type InnerWallet = HashMap<CurrencyId, u32>;
11
12#[derive(Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
13#[serde(transparent)]
14pub struct Wallet(#[serde(with = "internal_wallet")] pub InnerWallet);
15
16impl Endpoint for Wallet {
17    const AUTHENTICATED: bool = true;
18    const LOCALE: bool = false;
19    const URL: &'static str = "v2/account/wallet";
20    const VERSION: &'static str = "2022-07-25T00:00:00.000Z";
21}
22
23impl FixedEndpoint for Wallet {}
24
25impl Deref for Wallet {
26    type Target = InnerWallet;
27
28    fn deref(&self) -> &Self::Target {
29        &self.0
30    }
31}
32
33impl DerefMut for Wallet {
34    fn deref_mut(&mut self) -> &mut Self::Target {
35        &mut self.0
36    }
37}
38
39mod internal_wallet {
40    use std::collections::HashMap;
41
42    use serde::{
43        de::{SeqAccess, Visitor},
44        ser::Serializer,
45        Deserialize, Deserializer, Serialize,
46    };
47
48    use super::InnerWallet;
49    use crate::misc::currencies::CurrencyId;
50
51    #[derive(Debug, Serialize, Deserialize)]
52    struct InternalWallet {
53        id: CurrencyId,
54        value: u32,
55    }
56
57    pub fn serialize<S>(map: &InnerWallet, serializer: S) -> Result<S::Ok, S::Error>
58    where
59        S: Serializer,
60    {
61        serializer.collect_seq(
62            map.iter()
63                .map(|(&k, &v)| InternalWallet { id: k, value: v }),
64        )
65    }
66
67    pub fn deserialize<'de, D>(deserializer: D) -> Result<InnerWallet, D::Error>
68    where
69        D: Deserializer<'de>,
70    {
71        struct InternalWalletVisitor;
72
73        impl<'de> Visitor<'de> for InternalWalletVisitor {
74            type Value = InnerWallet;
75
76            fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
77                formatter.write_str("a sequence of InternalWallet")
78            }
79
80            fn visit_seq<V>(self, mut seq: V) -> Result<Self::Value, V::Error>
81            where
82                V: SeqAccess<'de>,
83            {
84                let mut map = HashMap::with_capacity(seq.size_hint().unwrap_or(0));
85
86                while let Some(item) = seq.next_element::<InternalWallet>()? {
87                    map.insert(item.id, item.value);
88                }
89
90                Ok(map)
91            }
92        }
93
94        deserializer.deserialize_seq(InternalWalletVisitor)
95    }
96}