diff --git a/src/resource/mod.rs b/src/resource/mod.rs index 290dcce..7f3a499 100644 --- a/src/resource/mod.rs +++ b/src/resource/mod.rs @@ -6,6 +6,7 @@ use std::collections::HashMap; use enumflags2::{bitflags, BitFlags}; pub use legacy_block_types::LEGACY_BLOCK_TYPES; +use serde::{de, Deserialize, Deserializer, Serialize, Serializer}; #[bitflags] #[repr(u8)] @@ -19,11 +20,29 @@ pub enum BlockFlag { Water, } -#[derive(Debug, Clone, Copy)] +fn serialize_block_flags(flags: &BitFlags, serializer: S) -> Result +where + S: Serializer, +{ + flags.bits().serialize(serializer) +} +fn deserialize_block_flags<'de, D>(deserializer: D) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let bits = u8::deserialize(deserializer)?; + BitFlags::::from_bits(bits).map_err(de::Error::custom) +} + +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct BlockColor(pub u8, pub u8, pub u8); -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct BlockType { + #[serde( + serialize_with = "serialize_block_flags", + deserialize_with = "deserialize_block_flags" + )] pub flags: BitFlags, pub color: BlockColor, } diff --git a/src/types.rs b/src/types.rs index a8c26e6..2598485 100644 --- a/src/types.rs +++ b/src/types.rs @@ -5,6 +5,7 @@ use std::{ }; use itertools::iproduct; +use serde::{Deserialize, Serialize}; macro_rules! coord_impl { ($t:ident, $max:expr) => { @@ -55,7 +56,7 @@ impl Debug for LayerBlockCoords { /// Generic array for data stored per block of a chunk layer /// /// Includes various convenient iteration functions. -#[derive(Debug, Clone, Copy, Default)] +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)] pub struct LayerBlockArray(pub [[T; BLOCKS_PER_CHUNK]; BLOCKS_PER_CHUNK]); impl LayerBlockArray { @@ -146,7 +147,7 @@ impl Debug for ChunkCoords { /// Generic array for data stored per chunk of a region /// /// Includes various convenient iteration functions. -#[derive(Debug, Clone, Copy, Default)] +#[derive(Debug, Clone, Copy, Default, Serialize, Deserialize)] pub struct ChunkArray(pub [[T; CHUNKS_PER_REGION]; CHUNKS_PER_REGION]); impl ChunkArray { diff --git a/src/world/layer.rs b/src/world/layer.rs index d57c51f..16260c4 100644 --- a/src/world/layer.rs +++ b/src/world/layer.rs @@ -1,5 +1,6 @@ use anyhow::{Context, Result}; use itertools::iproduct; +use serde::{Deserialize, Serialize}; use super::chunk::Chunk; use crate::{ @@ -7,7 +8,7 @@ use crate::{ types::*, }; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub struct BlockHeight(i32); impl BlockHeight { @@ -25,7 +26,7 @@ impl BlockHeight { } } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, Serialize, Deserialize)] pub struct BlockInfo { block_type: BlockType, y: BlockHeight,