valence_protocol/
game_mode.rs

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