rs_pixel/response/
boosters_response.rs

1use crate::types::game_type::GameType;
2use serde::{
3    de::{self, SeqAccess},
4    Deserialize, Deserializer, Serialize,
5};
6use std::fmt;
7
8#[derive(Serialize, Deserialize, Debug)]
9pub struct BoostersResponse {
10    pub success: bool,
11    pub boosters: Vec<Booster>,
12    #[serde(rename = "boosterState")]
13    pub booster_state: BoosterState,
14}
15
16#[derive(Serialize, Deserialize, Debug)]
17pub struct Booster {
18    #[serde(rename = "purchaserUuid")]
19    pub purchaser_uuid: String,
20    pub amount: f64,
21    #[serde(rename = "originalLength")]
22    pub original_length: i64,
23    pub length: i64,
24    #[serde(rename = "gameType")]
25    pub game_type: GameType,
26    #[serde(rename = "dateActivated")]
27    pub date_activated: i64,
28    #[serde(deserialize_with = "deserialize_stacked", default = "Default::default")]
29    pub stacked: Stacked,
30}
31
32#[derive(Serialize, Deserialize, Debug)]
33pub enum Stacked {
34    QueuedToStack(bool),
35    Stacked(Vec<String>),
36}
37
38impl Default for Stacked {
39    fn default() -> Self {
40        Stacked::QueuedToStack(false)
41    }
42}
43
44impl Stacked {
45    pub fn get_queued_to_stack(&self) -> Option<&bool> {
46        if let Stacked::QueuedToStack(v) = self {
47            Some(v)
48        } else {
49            None
50        }
51    }
52
53    pub fn get_stacked(&self) -> Option<&Vec<String>> {
54        if let Stacked::Stacked(v) = self {
55            Some(v)
56        } else {
57            None
58        }
59    }
60}
61
62fn deserialize_stacked<'de, D>(deserializer: D) -> Result<Stacked, D::Error>
63where
64    D: Deserializer<'de>,
65{
66    struct DeserializeStackedVisitor;
67
68    impl<'de> de::Visitor<'de> for DeserializeStackedVisitor {
69        type Value = Stacked;
70
71        fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
72            formatter.write_str("a Vec<String> or a bool")
73        }
74
75        fn visit_bool<E>(self, v: bool) -> Result<Self::Value, E>
76        where
77            E: de::Error,
78        {
79            Ok(Stacked::QueuedToStack(v))
80        }
81
82        fn visit_seq<V>(self, mut visitor: V) -> Result<Self::Value, V::Error>
83        where
84            V: SeqAccess<'de>,
85        {
86            let mut vec = Vec::new();
87            while let Some(elem) = visitor.next_element()? {
88                vec.push(elem);
89            }
90            Ok(Stacked::Stacked(vec))
91        }
92    }
93
94    deserializer.deserialize_any(DeserializeStackedVisitor)
95}
96
97#[derive(Serialize, Deserialize, Debug)]
98pub struct BoosterState {
99    pub decrementing: bool,
100}