rs-pixel 0.2.0

A complete, rate-limiting, asynchronous Rust implementation of the Hypixel Public API with extensive SkyBlock support
Documentation
use serde::{
    de::{self, Visitor},
    Deserialize, Deserializer, Serialize, Serializer,
};
use std::fmt;

#[derive(Debug, PartialEq, Eq, Hash)]
pub struct GameType(&'static str, &'static str, &'static str, i64);

impl GameType {
    pub fn name(&self) -> String {
        self.1.to_string()
    }

    pub fn db_name(&self) -> String {
        self.2.to_string()
    }

    pub fn id(&self) -> i64 {
        self.3
    }

    pub const QUAKECRAFT: Self = Self("QUAKECRAFT", "Quakecraft", "Quake", 2);
    pub const WALLS: Self = Self("WALLS", "Walls", "Walls", 3);
    pub const PAINTBALL: Self = Self("PAINTBALL", "Paintball", "Paintball", 4);
    pub const SURVIVAL_GAMES: Self =
        Self("SURVIVAL_GAMES", "Blitz Survival Games", "HungerGames", 5);
    pub const TNTGAMES: Self = Self("TNTGAMES", "The TNT Games", "TNTGames", 6);
    pub const VAMPIREZ: Self = Self("VAMPIREZ", "VampireZ", "VampireZ", 7);
    pub const WALLS3: Self = Self("WALLS3", "Mega Walls", "Walls3", 13);
    pub const ARCADE: Self = Self("ARCADE", "Arcade", "Arcade", 14);
    pub const ARENA: Self = Self("ARENA", "Arena Brawl", "Arena", 17);
    pub const MCGO: Self = Self("MCGO", "Cops and Crims", "MCGO", 21);
    pub const UHC: Self = Self("UHC", "UHC Champions", "UHC", 20);
    pub const BATTLEGROUND: Self = Self("BATTLEGROUND", "Warlords", "Battleground", 23);
    pub const SUPER_SMASH: Self = Self("SUPER_SMASH", "Smash Heroes", "SuperSmash", 24);
    pub const GINGERBREAD: Self = Self("GINGERBREAD", "Turbo Kart Racers", "GingerBread", 25);
    pub const HOUSING: Self = Self("HOUSING", "Housing", "Housing", 26);
    pub const SKYWARS: Self = Self("SKYWARS", "SkyWars", "SkyWars", 51);
    pub const TRUE_COMBAT: Self = Self("TRUE_COMBAT", "Crazy Walls", "TrueCombat", 52);
    pub const SPEED_UHC: Self = Self("SPEED_UHC", "Speed UHC", "SpeedUHC", 54);
    pub const SKYCLASH: Self = Self("SKYCLASH", "SkyClash", "SkyClash", 55);
    pub const LEGACY: Self = Self("LEGACY", "Classic Games", "Legacy", 56);
    pub const PROTOTYPE: Self = Self("PROTOTYPE", "Prototype", "Prototype", 57);
    pub const BEDWARS: Self = Self("BEDWARS", "Bed Wars", "Bedwars", 58);
    pub const MURDER_MYSTERY: Self = Self("MURDER_MYSTERY", "Murder Mystery", "MurderMystery", 59);
    pub const BUILD_BATTLE: Self = Self("BUILD_BATTLE", "Build Battle", "BuildBattle", 60);
    pub const DUELS: Self = Self("DUELS", "Duels", "Duels", 61);
    pub const SKYBLOCK: Self = Self("SKYBLOCK", "SkyBlock", "SkyBlock", 63);
    pub const PIT: Self = Self("PIT", "Pit", "Pit", 64);
    pub const REPLAY: Self = Self("REPLAY", "Replay", "Replay", 65);
    pub const SMP: Self = Self("SMP", "SMP", "SMP", 67);
    pub const WOOL_GAMES: Self = Self("WOOL_GAMES", "Wool Wars", "WoolGames", 68);
    pub const UNKNOWN: Self = Self("UNKNOWN", "Unknown", "Unknown", -1);
}

impl Serialize for GameType {
    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
    where
        S: Serializer,
    {
        serializer.serialize_str(self.0)
    }
}

impl<'de> Deserialize<'de> for GameType {
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        struct GameTypeVisitor;

        impl<'de> Visitor<'de> for GameTypeVisitor {
            type Value = GameType;

            fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
                formatter.write_str("a u64 or String")
            }

            fn visit_u64<E>(self, value: u64) -> Result<Self::Value, E>
            where
                E: de::Error,
            {
                Ok(GameType::from(value))
            }

            fn visit_string<E>(self, value: String) -> Result<Self::Value, E>
            where
                E: de::Error,
            {
                Ok(GameType::from(value))
            }

            fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
            where
                E: de::Error,
            {
                Ok(GameType::from(value.to_string()))
            }
        }

        deserializer.deserialize_any(GameTypeVisitor)
    }
}

impl From<u64> for GameType {
    fn from(v: u64) -> Self {
        match v {
            2 => GameType::QUAKECRAFT,
            3 => GameType::WALLS,
            4 => GameType::PAINTBALL,
            5 => GameType::SURVIVAL_GAMES,
            6 => GameType::TNTGAMES,
            7 => GameType::VAMPIREZ,
            13 => GameType::WALLS3,
            14 => GameType::ARCADE,
            17 => GameType::ARENA,
            21 => GameType::MCGO,
            20 => GameType::UHC,
            23 => GameType::BATTLEGROUND,
            24 => GameType::SUPER_SMASH,
            25 => GameType::GINGERBREAD,
            26 => GameType::HOUSING,
            51 => GameType::SKYWARS,
            52 => GameType::TRUE_COMBAT,
            54 => GameType::SPEED_UHC,
            55 => GameType::SKYCLASH,
            56 => GameType::LEGACY,
            57 => GameType::PROTOTYPE,
            58 => GameType::BEDWARS,
            59 => GameType::MURDER_MYSTERY,
            60 => GameType::BUILD_BATTLE,
            61 => GameType::DUELS,
            63 => GameType::SKYBLOCK,
            64 => GameType::PIT,
            65 => GameType::REPLAY,
            67 => GameType::SMP,
            68 => GameType::WOOL_GAMES,
            _ => GameType::UNKNOWN,
        }
    }
}

impl From<String> for GameType {
    fn from(v: String) -> Self {
        match v.as_str() {
            "QUAKECRAFT" => GameType::QUAKECRAFT,
            "WALLS" => GameType::WALLS,
            "PAINTBALL" => GameType::PAINTBALL,
            "SURVIVAL_GAMES" => GameType::SURVIVAL_GAMES,
            "TNTGAMES" => GameType::TNTGAMES,
            "VAMPIREZ" => GameType::VAMPIREZ,
            "WALLS3" => GameType::WALLS3,
            "ARCADE" => GameType::ARCADE,
            "ARENA" => GameType::ARENA,
            "MCGO" => GameType::MCGO,
            "UHC" => GameType::UHC,
            "BATTLEGROUND" => GameType::BATTLEGROUND,
            "SUPER_SMASH" => GameType::SUPER_SMASH,
            "GINGERBREAD" => GameType::GINGERBREAD,
            "HOUSING" => GameType::HOUSING,
            "SKYWARS" => GameType::SKYWARS,
            "TRUE_COMBAT" => GameType::TRUE_COMBAT,
            "SPEED_UHC" => GameType::SPEED_UHC,
            "SKYCLASH" => GameType::SKYCLASH,
            "LEGACY" => GameType::LEGACY,
            "PROTOTYPE" => GameType::PROTOTYPE,
            "BEDWARS" => GameType::BEDWARS,
            "MURDER_MYSTERY" => GameType::MURDER_MYSTERY,
            "BUILD_BATTLE" => GameType::BUILD_BATTLE,
            "DUELS" => GameType::DUELS,
            "SKYBLOCK" => GameType::SKYBLOCK,
            "PIT" => GameType::PIT,
            "REPLAY" => GameType::REPLAY,
            "SMP" => GameType::SMP,
            "WOOL_GAMES" => GameType::WOOL_GAMES,
            _ => GameType::UNKNOWN,
        }
    }
}