reddit_rs/models/
award.rs

1use std::collections::HashMap;
2
3use iri_string::types::IriAbsoluteString;
4use serde::{de::Unexpected, Deserialize, Serialize};
5
6use crate::models::{
7    fullname::FullName,
8    icon::{Icon, IconFormat},
9};
10
11#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
12pub struct Awarding {
13    giver_coin_reward: Option<u16>,
14    subreddit_id: Option<FullName>,
15    is_new: bool,
16    days_of_drip_extension: u32,
17    coin_price: u32,
18    /// REVIEW: award_483d8e29-bbe5-404e-a09a-c2d7b16c4fff
19    id: String,
20    penny_donate: Option<u32>,
21    award_sub_type: AwardSubType,
22    coin_reward: u32,
23    icon_url: IriAbsoluteString,
24    days_of_premium: u32,
25    tiers_by_required_awardings: Option<TiersByRequiredAwardings>,
26    resized_icons: Vec<Icon>,
27    resized_static_icons: Vec<Icon>,
28    icon_width: u32,
29    static_icon_width: u32,
30    start_date: Option<()>,
31    is_enabled: bool,
32    awardings_required_to_grant_benefits: Option<u32>,
33    description: String,
34    end_date: Option<()>,
35    subreddit_coin_reward: u32,
36    count: u32,
37    static_icon_height: u32,
38    name: String,
39    icon_format: Option<IconFormat>,
40    icon_height: u32,
41    penny_price: Option<u32>,
42    award_type: AwardType,
43    static_icon_url: IriAbsoluteString,
44}
45
46#[derive(Debug, Clone, Serialize, PartialEq)]
47pub struct TiersByRequiredAwardings(HashMap<u32, RequiredAwardings>);
48
49impl<'de> Deserialize<'de> for TiersByRequiredAwardings {
50    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
51    where
52        D: serde::Deserializer<'de>,
53    {
54        use serde::de::Error;
55
56        let map = HashMap::<String, RequiredAwardings>::deserialize(deserializer)?;
57
58        Ok(Self(
59            map.into_iter()
60                .map(|(k, v)| match k.parse() {
61                    Ok(i) => Ok((i, v)),
62                    Err(_why) => Err(D::Error::invalid_value(
63                        Unexpected::Str(&k),
64                        &"a numeric string key",
65                    )),
66                })
67                .collect::<Result<HashMap<u32, RequiredAwardings>, _>>()?,
68        ))
69    }
70}
71
72#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
73pub struct RequiredAwardings {
74    resized_icons: Vec<Icon>,
75    resized_static_icons: Vec<Icon>,
76    awardings_required: u32,
77    icon: Icon,
78    static_icon: Icon,
79}
80
81#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
82#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
83pub enum AwardSubType {
84    Global,
85    Premium,
86    Group,
87    Appreciation,
88    Community,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
92#[serde(rename_all = "snake_case")]
93pub enum AwardType {
94    Global,
95    Community,
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
99#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
100pub enum TopAwardedType {
101    Active,
102    Inactive,
103}