chunkedge_protocol/
game_mode.rs

1use std::io::Write;
2
3use anyhow::bail;
4use bevy_ecs::prelude::*;
5use chunkedge_binary::{Decode, Encode};
6use derive_more::{From, Into};
7
8#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Encode, Decode, Component)]
9pub enum GameMode {
10    #[default]
11    Survival,
12    Creative,
13    Adventure,
14    Spectator,
15}
16
17/// An optional [`GameMode`] with `None` encoded as `-1`. Isomorphic to
18/// `Option<GameMode>`.
19#[derive(Copy, Clone, PartialEq, Eq, Default, Debug, From, Into)]
20pub struct OptGameMode(pub Option<GameMode>);
21
22impl Encode for OptGameMode {
23    fn encode(&self, w: impl Write) -> anyhow::Result<()> {
24        match self.0 {
25            Some(gm) => (gm as i8).encode(w),
26            None => (-1_i8).encode(w),
27        }
28    }
29}
30
31impl Decode<'_> for OptGameMode {
32    fn decode(r: &mut &'_ [u8]) -> anyhow::Result<Self> {
33        Ok(Self(match i8::decode(r)? {
34            -1 => None,
35            0 => Some(GameMode::Survival),
36            1 => Some(GameMode::Creative),
37            2 => Some(GameMode::Adventure),
38            3 => Some(GameMode::Spectator),
39            other => bail!("invalid game mode byte of {other}"),
40        }))
41    }
42}