mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/mod.rs')
| -rw-r--r-- | src/data/mod.rs | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/data/mod.rs b/src/data/mod.rs index 7817694..877c606 100644 --- a/src/data/mod.rs +++ b/src/data/mod.rs @@ -1,6 +1,8 @@ +use std::fmt; use std::str::Utf8Error; pub mod base64; +pub mod dynamic; pub struct DataRead<'d> { @@ -65,6 +67,28 @@ impl<'d> DataRead<'d> self.data = &self.data[end..]; Ok(result) } + + pub fn read_bytes(&mut self, dst: &mut [u8]) -> Result<(), ReadError> + { + if self.data.len() < dst.len() + { + return Err(ReadError::Underflow{need: dst.len(), have: self.data.len()}); + } + dst.copy_from_slice(&self.data[..dst.len()]); + self.data = &self.data[dst.len()..]; + Ok(()) + } + + pub fn read_vec(&mut self, dst: &mut Vec<u8>, len: usize) -> Result<(), ReadError> + { + if self.data.len() < len + { + return Err(ReadError::Underflow{need: len, have: self.data.len()}); + } + dst.extend_from_slice(&self.data[..len]); + self.data = &self.data[len..]; + Ok(()) + } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] @@ -164,6 +188,13 @@ impl<'d> DataWrite<'d> Ok(()) } + pub fn write_bytes(&mut self, val: &[u8]) -> Result<(), WriteError> + { + self.data.check_capacity(val.len())?; + self.data.write(val); + Ok(()) + } + pub fn is_owned(&self) -> bool { match self.data @@ -228,6 +259,110 @@ impl<'d> TryFrom<DataWrite<'d>> for Vec<u8> } } +pub trait Serializer<D> +{ + type ReadError; + type WriteError; + + fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<D, Self::ReadError>; + + fn serialize(&mut self, buff: &mut DataWrite<'_>, data: &D) -> Result<(), Self::WriteError>; +} + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub struct GridPos(pub u16, pub u16); + +impl From<u32> for GridPos +{ + fn from(value: u32) -> Self + { + GridPos((value >> 16) as u16, value as u16) + } +} + +impl From<GridPos> for u32 +{ + fn from(value: GridPos) -> Self + { + ((value.0 as u32) << 16) | (value.1 as u32) + } +} + +#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd)] +pub struct Team(u8); + +impl Team +{ + pub fn of(id: u8) -> Self + { + Self(id) + } + + pub fn get_id(&self) -> u8 + { + self.0 + } + + pub fn is_base(&self) -> bool + { + self.0 < 6 + } + + pub fn get_name(&self) -> Option<&'static str> + { + match self.0 + { + 0 => Some("derelict"), + 1 => Some("sharded"), + 2 => Some("crux"), + 3 => Some("malis"), + 4 => Some("green"), + 5 => Some("blue"), + _ => None, + } + } +} + +impl From<u8> for Team +{ + fn from(value: u8) -> Self + { + Team::of(value) + } +} + +impl From<Team> for u8 +{ + fn from(value: Team) -> Self + { + value.0 + } +} + +impl fmt::Display for Team +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result + { + match self.0 + { + 0 => f.write_str("Derelict"), + 1 => f.write_str("Sharded"), + 2 => f.write_str("Crux"), + 3 => f.write_str("Malis"), + 4 => f.write_str("Green"), + 5 => f.write_str("Blue"), + id => write!(f, "Team #{id}"), + } + } +} + +pub const TEAM_DERELICT: Team = Team(0); +pub const TEAM_SHARDED: Team = Team(1); +pub const TEAM_CRUX: Team = Team(2); +pub const TEAM_MALIS: Team = Team(3); +pub const TEAM_GREEN: Team = Team(4); +pub const TEAM_BLUE: Team = Team(5); + #[cfg(test)] mod test { |