rs_pixel/response/
boosters_response.rs1use 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}