mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'src/data/dynamic.rs')
| -rw-r--r-- | src/data/dynamic.rs | 1019 |
1 files changed, 528 insertions, 491 deletions
diff --git a/src/data/dynamic.rs b/src/data/dynamic.rs index 874dc6b..b1c4095 100644 --- a/src/data/dynamic.rs +++ b/src/data/dynamic.rs @@ -2,514 +2,460 @@ use std::error::Error; use std::fmt; use crate::content; -use crate::data::{self, DataRead, DataWrite, GridPos, Serializer}; use crate::data::command::{self, UnitCommand}; +use crate::data::{self, DataRead, DataWrite, GridPos, Serializer}; use crate::logic::LogicField; use crate::team::Team; #[derive(Clone, Debug, PartialEq)] -pub enum DynData -{ - Empty, - Int(i32), - Long(i64), - Float(f32), - String(Option<String>), - Content(content::Type, u16), - IntArray(Vec<i32>), - Point2(i32, i32), - Point2Array(Vec<(i16, i16)>), - TechNode(content::Type, u16), - Boolean(bool), - Double(f64), - Building(GridPos), - LogicField(LogicField), - ByteArray(Vec<u8>), - UnitCommand(UnitCommand), - BoolArray(Vec<bool>), - Unit(u32), - Vec2Array(Vec<(f32, f32)>), - Vec2(f32, f32), - Team(Team), +pub enum DynData { + Empty, + Int(i32), + Long(i64), + Float(f32), + String(Option<String>), + Content(content::Type, u16), + IntArray(Vec<i32>), + Point2(i32, i32), + Point2Array(Vec<(i16, i16)>), + TechNode(content::Type, u16), + Boolean(bool), + Double(f64), + Building(GridPos), + LogicField(LogicField), + ByteArray(Vec<u8>), + UnitCommand(UnitCommand), + BoolArray(Vec<bool>), + Unit(u32), + Vec2Array(Vec<(f32, f32)>), + Vec2(f32, f32), + Team(Team), } -impl DynData -{ - pub fn get_type(&self) -> DynType - { - match self - { - Self::Empty => DynType::Empty, - Self::Int(..) => DynType::Int, - Self::Long(..) => DynType::Long, - Self::Float(..) => DynType::Float, - Self::String(..) => DynType::String, - Self::Content(..) => DynType::Content, - Self::IntArray(..) => DynType::IntArray, - Self::Point2(..) => DynType::Point2, - Self::Point2Array(..) => DynType::Point2Array, - Self::TechNode(..) => DynType::TechNode, - Self::Boolean(..) => DynType::Boolean, - Self::Double(..) => DynType::Double, - Self::Building(..) => DynType::Building, - Self::LogicField(..) => DynType::LogicField, - Self::ByteArray(..) => DynType::ByteArray, - Self::UnitCommand(..) => DynType::UnitCommand, - Self::BoolArray(..) => DynType::BoolArray, - Self::Unit(..) => DynType::Unit, - Self::Vec2Array(..) => DynType::Vec2Array, - Self::Vec2(..) => DynType::Vec2, - Self::Team(..) => DynType::Team, - } - } +impl DynData { + pub fn get_type(&self) -> DynType { + match self { + Self::Empty => DynType::Empty, + Self::Int(..) => DynType::Int, + Self::Long(..) => DynType::Long, + Self::Float(..) => DynType::Float, + Self::String(..) => DynType::String, + Self::Content(..) => DynType::Content, + Self::IntArray(..) => DynType::IntArray, + Self::Point2(..) => DynType::Point2, + Self::Point2Array(..) => DynType::Point2Array, + Self::TechNode(..) => DynType::TechNode, + Self::Boolean(..) => DynType::Boolean, + Self::Double(..) => DynType::Double, + Self::Building(..) => DynType::Building, + Self::LogicField(..) => DynType::LogicField, + Self::ByteArray(..) => DynType::ByteArray, + Self::UnitCommand(..) => DynType::UnitCommand, + Self::BoolArray(..) => DynType::BoolArray, + Self::Unit(..) => DynType::Unit, + Self::Vec2Array(..) => DynType::Vec2Array, + Self::Vec2(..) => DynType::Vec2, + Self::Team(..) => DynType::Team, + } + } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum DynType -{ - Empty, Int, Long, Float, String, Content, IntArray, Point2, Point2Array, TechNode, Boolean, Double, Building, - LogicField, ByteArray, UnitCommand, BoolArray, Unit, Vec2Array, Vec2, Team, +pub enum DynType { + Empty, + Int, + Long, + Float, + String, + Content, + IntArray, + Point2, + Point2Array, + TechNode, + Boolean, + Double, + Building, + LogicField, + ByteArray, + UnitCommand, + BoolArray, + Unit, + Vec2Array, + Vec2, + Team, } pub struct DynSerializer; -impl Serializer<DynData> for DynSerializer -{ - type ReadError = ReadError; - type WriteError = WriteError; - - fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<DynData, Self::ReadError> - { - match buff.read_u8()? - { - 0 => Ok(DynData::Empty), - 1 => Ok(DynData::Int(buff.read_i32()?)), - 2 => Ok(DynData::Long(buff.read_i64()?)), - 3 => Ok(DynData::Float(buff.read_f32()?)), - 4 => - { - if buff.read_bool()? - { - Ok(DynData::String(Some(String::from(buff.read_utf()?)))) - } - else {Ok(DynData::String(None))} - }, - 5 => Ok(DynData::Content(content::Type::try_from(buff.read_u8()?)?, buff.read_u16()?)), - 6 => - { - let len = buff.read_i16()?; - if len < 0 - { - return Err(ReadError::IntArrayLen(len)); - } - let mut result = Vec::<i32>::new(); - result.reserve(len as usize); - for _ in 0..len - { - result.push(buff.read_i32()?); - } - Ok(DynData::IntArray(result)) - }, - 7 => Ok(DynData::Point2(buff.read_i32()?, buff.read_i32()?)), - 8 => - { - let len = buff.read_i8()?; - if len < 0 - { - return Err(ReadError::Point2ArrayLen(len)); - } - let mut result = Vec::<(i16, i16)>::new(); - result.reserve(len as usize); - for _ in 0..len - { - let pt = buff.read_i32()?; - result.push(((pt >> 16) as i16, pt as i16)); - } - Ok(DynData::Point2Array(result)) - }, - 9 => Ok(DynData::TechNode(content::Type::try_from(buff.read_u8()?)?, buff.read_u16()?)), - 10 => Ok(DynData::Boolean(buff.read_bool()?)), - 11 => Ok(DynData::Double(buff.read_f64()?)), - 12 => Ok(DynData::Building(GridPos::from(buff.read_u32()?))), - 13 => - { - let id = buff.read_u8()?; - match LogicField::try_from(id) - { - Ok(f) => Ok(DynData::LogicField(f)), - Err(..) => Err(ReadError::LogicField(id)), - } - }, - 14 => - { - let len = buff.read_i32()?; - if len < 0 - { - return Err(ReadError::ByteArrayLen(len)); - } - let mut result = Vec::<u8>::new(); - buff.read_vec(&mut result, len as usize)?; - Ok(DynData::ByteArray(result)) - }, - 15 => - { - let id = buff.read_u8()?; - match UnitCommand::try_from(id) - { - Ok(f) => Ok(DynData::UnitCommand(f)), - Err(e) => Err(ReadError::UnitCommand(e)), - } - }, - 16 => - { - let len = buff.read_i32()?; - if len < 0 - { - return Err(ReadError::BoolArrayLen(len)); - } - let mut result = Vec::<bool>::new(); - result.reserve(len as usize); - for _ in 0..len - { - result.push(buff.read_bool()?); - } - Ok(DynData::BoolArray(result)) - }, - 17 => Ok(DynData::Unit(buff.read_u32()?)), - 18 => - { - let len = buff.read_i16()?; - if len < 0 - { - return Err(ReadError::Vec2ArrayLen(len)); - } - let mut result = Vec::<(f32, f32)>::new(); - result.reserve(len as usize); - for _ in 0..len - { - result.push((buff.read_f32()?, buff.read_f32()?)); - } - Ok(DynData::Vec2Array(result)) - }, - 19 => Ok(DynData::Vec2(buff.read_f32()?, buff.read_f32()?)), - 20 => Ok(DynData::Team(Team::of(buff.read_u8()?))), - id => Err(ReadError::Type(id)), - } - } - - fn serialize(&mut self, buff: &mut DataWrite<'_>, data: &DynData) -> Result<(), Self::WriteError> - { - match data - { - DynData::Empty => - { - buff.write_u8(0)?; - Ok(()) - }, - DynData::Int(val) => - { - buff.write_u8(1)?; - buff.write_i32(*val)?; - Ok(()) - }, - DynData::Long(val) => - { - buff.write_u8(2)?; - buff.write_i64(*val)?; - Ok(()) - }, - DynData::Float(val) => - { - buff.write_u8(3)?; - buff.write_f32(*val)?; - Ok(()) - }, - DynData::String(opt) => - { - buff.write_u8(4)?; - match opt - { - None => buff.write_bool(false)?, - Some(s) => - { - buff.write_bool(true)?; - buff.write_utf(s)? - }, - } - Ok(()) - }, - DynData::Content(ty, id) => - { - buff.write_u8(5)?; - buff.write_u8((*ty).into())?; - buff.write_u16(*id)?; - Ok(()) - }, - DynData::IntArray(arr) => - { - if arr.len() > i16::MAX as usize - { - return Err(WriteError::IntArrayLen(arr.len())); - } - buff.write_u8(6)?; - buff.write_i16(arr.len() as i16)?; - for &v in arr.iter() - { - buff.write_i32(v)?; - } - Ok(()) - }, - DynData::Point2(x, y) => - { - buff.write_u8(7)?; - buff.write_i32(*x)?; - buff.write_i32(*y)?; - Ok(()) - }, - DynData::Point2Array(arr) => - { - if arr.len() > i8::MAX as usize - { - return Err(WriteError::Point2ArrayLen(arr.len())); - } - buff.write_u8(8)?; - buff.write_i8(arr.len() as i8)?; - for &(x, y) in arr.iter() - { - buff.write_i32(((x as i32) << 16) | ((y as i32) & 0xFFFF))?; - } - Ok(()) - }, - DynData::TechNode(ty, id) => - { - buff.write_u8(9)?; - buff.write_u8((*ty).into())?; - buff.write_u16(*id)?; - Ok(()) - }, - DynData::Boolean(val) => - { - buff.write_u8(10)?; - buff.write_bool(*val)?; - Ok(()) - }, - DynData::Double(val) => - { - buff.write_u8(11)?; - buff.write_f64(*val)?; - Ok(()) - }, - DynData::Building(pos) => - { - buff.write_u8(12)?; - buff.write_u32(u32::from(*pos))?; - Ok(()) - }, - DynData::LogicField(fld) => - { - buff.write_u8(13)?; - buff.write_u8(u8::from(*fld))?; - Ok(()) - }, - DynData::ByteArray(arr) => - { - if arr.len() > i32::MAX as usize - { - return Err(WriteError::ByteArrayLen(arr.len())); - } - buff.write_u8(14)?; - buff.write_i32(arr.len() as i32)?; - buff.write_bytes(arr)?; - Ok(()) - }, - DynData::UnitCommand(cmd) => - { - buff.write_u8(15)?; - buff.write_u8(u8::from(*cmd))?; - Ok(()) - }, - DynData::BoolArray(arr) => - { - if arr.len() > i32::MAX as usize - { - return Err(WriteError::BoolArrayLen(arr.len())); - } - buff.write_u8(16)?; - buff.write_i32(arr.len() as i32)?; - for &b in arr.iter() - { - buff.write_bool(b)?; - } - Ok(()) - }, - DynData::Unit(id) => - { - buff.write_u8(17)?; - buff.write_u32(*id)?; - Ok(()) - }, - DynData::Vec2Array(arr) => - { - if arr.len() > i16::MAX as usize - { - return Err(WriteError::Vec2ArrayLen(arr.len())); - } - buff.write_u8(18)?; - buff.write_i16(arr.len() as i16)?; - for &(x, y) in arr.iter() - { - buff.write_f32(x)?; - buff.write_f32(y)?; - } - Ok(()) - }, - DynData::Vec2(x, y) => - { - buff.write_u8(19)?; - buff.write_f32(*x)?; - buff.write_f32(*y)?; - Ok(()) - }, - DynData::Team(team) => - { - buff.write_u8(20)?; - buff.write_u8(u8::from(*team))?; - Ok(()) - }, - } - } +impl Serializer<DynData> for DynSerializer { + type ReadError = ReadError; + type WriteError = WriteError; + + fn deserialize(&mut self, buff: &mut DataRead<'_>) -> Result<DynData, Self::ReadError> { + match buff.read_u8()? { + 0 => Ok(DynData::Empty), + 1 => Ok(DynData::Int(buff.read_i32()?)), + 2 => Ok(DynData::Long(buff.read_i64()?)), + 3 => Ok(DynData::Float(buff.read_f32()?)), + 4 => { + if buff.read_bool()? { + Ok(DynData::String(Some(String::from(buff.read_utf()?)))) + } else { + Ok(DynData::String(None)) + } + } + 5 => Ok(DynData::Content( + content::Type::try_from(buff.read_u8()?)?, + buff.read_u16()?, + )), + 6 => { + let len = buff.read_i16()?; + if len < 0 { + return Err(ReadError::IntArrayLen(len)); + } + let mut result = Vec::<i32>::new(); + result.reserve(len as usize); + for _ in 0..len { + result.push(buff.read_i32()?); + } + Ok(DynData::IntArray(result)) + } + 7 => Ok(DynData::Point2(buff.read_i32()?, buff.read_i32()?)), + 8 => { + let len = buff.read_i8()?; + if len < 0 { + return Err(ReadError::Point2ArrayLen(len)); + } + let mut result = Vec::<(i16, i16)>::new(); + result.reserve(len as usize); + for _ in 0..len { + let pt = buff.read_i32()?; + result.push(((pt >> 16) as i16, pt as i16)); + } + Ok(DynData::Point2Array(result)) + } + 9 => Ok(DynData::TechNode( + content::Type::try_from(buff.read_u8()?)?, + buff.read_u16()?, + )), + 10 => Ok(DynData::Boolean(buff.read_bool()?)), + 11 => Ok(DynData::Double(buff.read_f64()?)), + 12 => Ok(DynData::Building(GridPos::from(buff.read_u32()?))), + 13 => { + let id = buff.read_u8()?; + match LogicField::try_from(id) { + Ok(f) => Ok(DynData::LogicField(f)), + Err(..) => Err(ReadError::LogicField(id)), + } + } + 14 => { + let len = buff.read_i32()?; + if len < 0 { + return Err(ReadError::ByteArrayLen(len)); + } + let mut result = Vec::<u8>::new(); + buff.read_vec(&mut result, len as usize)?; + Ok(DynData::ByteArray(result)) + } + 15 => { + let id = buff.read_u8()?; + match UnitCommand::try_from(id) { + Ok(f) => Ok(DynData::UnitCommand(f)), + Err(e) => Err(ReadError::UnitCommand(e)), + } + } + 16 => { + let len = buff.read_i32()?; + if len < 0 { + return Err(ReadError::BoolArrayLen(len)); + } + let mut result = Vec::<bool>::new(); + result.reserve(len as usize); + for _ in 0..len { + result.push(buff.read_bool()?); + } + Ok(DynData::BoolArray(result)) + } + 17 => Ok(DynData::Unit(buff.read_u32()?)), + 18 => { + let len = buff.read_i16()?; + if len < 0 { + return Err(ReadError::Vec2ArrayLen(len)); + } + let mut result = Vec::<(f32, f32)>::new(); + result.reserve(len as usize); + for _ in 0..len { + result.push((buff.read_f32()?, buff.read_f32()?)); + } + Ok(DynData::Vec2Array(result)) + } + 19 => Ok(DynData::Vec2(buff.read_f32()?, buff.read_f32()?)), + 20 => Ok(DynData::Team(Team::of(buff.read_u8()?))), + id => Err(ReadError::Type(id)), + } + } + + fn serialize( + &mut self, + buff: &mut DataWrite<'_>, + data: &DynData, + ) -> Result<(), Self::WriteError> { + match data { + DynData::Empty => { + buff.write_u8(0)?; + Ok(()) + } + DynData::Int(val) => { + buff.write_u8(1)?; + buff.write_i32(*val)?; + Ok(()) + } + DynData::Long(val) => { + buff.write_u8(2)?; + buff.write_i64(*val)?; + Ok(()) + } + DynData::Float(val) => { + buff.write_u8(3)?; + buff.write_f32(*val)?; + Ok(()) + } + DynData::String(opt) => { + buff.write_u8(4)?; + match opt { + None => buff.write_bool(false)?, + Some(s) => { + buff.write_bool(true)?; + buff.write_utf(s)? + } + } + Ok(()) + } + DynData::Content(ty, id) => { + buff.write_u8(5)?; + buff.write_u8((*ty).into())?; + buff.write_u16(*id)?; + Ok(()) + } + DynData::IntArray(arr) => { + if arr.len() > i16::MAX as usize { + return Err(WriteError::IntArrayLen(arr.len())); + } + buff.write_u8(6)?; + buff.write_i16(arr.len() as i16)?; + for &v in arr.iter() { + buff.write_i32(v)?; + } + Ok(()) + } + DynData::Point2(x, y) => { + buff.write_u8(7)?; + buff.write_i32(*x)?; + buff.write_i32(*y)?; + Ok(()) + } + DynData::Point2Array(arr) => { + if arr.len() > i8::MAX as usize { + return Err(WriteError::Point2ArrayLen(arr.len())); + } + buff.write_u8(8)?; + buff.write_i8(arr.len() as i8)?; + for &(x, y) in arr.iter() { + buff.write_i32(((x as i32) << 16) | ((y as i32) & 0xFFFF))?; + } + Ok(()) + } + DynData::TechNode(ty, id) => { + buff.write_u8(9)?; + buff.write_u8((*ty).into())?; + buff.write_u16(*id)?; + Ok(()) + } + DynData::Boolean(val) => { + buff.write_u8(10)?; + buff.write_bool(*val)?; + Ok(()) + } + DynData::Double(val) => { + buff.write_u8(11)?; + buff.write_f64(*val)?; + Ok(()) + } + DynData::Building(pos) => { + buff.write_u8(12)?; + buff.write_u32(u32::from(*pos))?; + Ok(()) + } + DynData::LogicField(fld) => { + buff.write_u8(13)?; + buff.write_u8(u8::from(*fld))?; + Ok(()) + } + DynData::ByteArray(arr) => { + if arr.len() > i32::MAX as usize { + return Err(WriteError::ByteArrayLen(arr.len())); + } + buff.write_u8(14)?; + buff.write_i32(arr.len() as i32)?; + buff.write_bytes(arr)?; + Ok(()) + } + DynData::UnitCommand(cmd) => { + buff.write_u8(15)?; + buff.write_u8(u8::from(*cmd))?; + Ok(()) + } + DynData::BoolArray(arr) => { + if arr.len() > i32::MAX as usize { + return Err(WriteError::BoolArrayLen(arr.len())); + } + buff.write_u8(16)?; + buff.write_i32(arr.len() as i32)?; + for &b in arr.iter() { + buff.write_bool(b)?; + } + Ok(()) + } + DynData::Unit(id) => { + buff.write_u8(17)?; + buff.write_u32(*id)?; + Ok(()) + } + DynData::Vec2Array(arr) => { + if arr.len() > i16::MAX as usize { + return Err(WriteError::Vec2ArrayLen(arr.len())); + } + buff.write_u8(18)?; + buff.write_i16(arr.len() as i16)?; + for &(x, y) in arr.iter() { + buff.write_f32(x)?; + buff.write_f32(y)?; + } + Ok(()) + } + DynData::Vec2(x, y) => { + buff.write_u8(19)?; + buff.write_f32(*x)?; + buff.write_f32(*y)?; + Ok(()) + } + DynData::Team(team) => { + buff.write_u8(20)?; + buff.write_u8(u8::from(*team))?; + Ok(()) + } + } + } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum ReadError -{ - Underlying(data::ReadError), - Type(u8), - ContentType(content::TryFromU8Error), - IntArrayLen(i16), - Point2ArrayLen(i8), - LogicField(u8), - ByteArrayLen(i32), - UnitCommand(command::TryFromU8Error), - BoolArrayLen(i32), - Vec2ArrayLen(i16), +pub enum ReadError { + Underlying(data::ReadError), + Type(u8), + ContentType(content::TryFromU8Error), + IntArrayLen(i16), + Point2ArrayLen(i8), + LogicField(u8), + ByteArrayLen(i32), + UnitCommand(command::TryFromU8Error), + BoolArrayLen(i32), + Vec2ArrayLen(i16), } -impl From<data::ReadError> for ReadError -{ - fn from(err: data::ReadError) -> Self - { - Self::Underlying(err) - } +impl From<data::ReadError> for ReadError { + fn from(err: data::ReadError) -> Self { + Self::Underlying(err) + } } -impl From<content::TryFromU8Error> for ReadError -{ - fn from(err: content::TryFromU8Error) -> Self - { - Self::ContentType(err) - } +impl From<content::TryFromU8Error> for ReadError { + fn from(err: content::TryFromU8Error) -> Self { + Self::ContentType(err) + } } -impl From<command::TryFromU8Error> for ReadError -{ - fn from(err: command::TryFromU8Error) -> Self - { - Self::UnitCommand(err) - } +impl From<command::TryFromU8Error> for ReadError { + fn from(err: command::TryFromU8Error) -> Self { + Self::UnitCommand(err) + } } -impl fmt::Display for ReadError -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result - { - match self - { - Self::Underlying(..) => f.write_str("failed to read from buffer"), - Self::Type(id) => write!(f, "invalid dynamic data type ({id})"), - Self::ContentType(..) => f.write_str("content type not found"), - Self::IntArrayLen(len) => write!(f, "integer array too long ({len})"), - Self::Point2ArrayLen(len) => write!(f, "point2 array too long ({len})"), - Self::LogicField(id) => write!(f, "invalid logic field ({id})"), - Self::ByteArrayLen(len) => write!(f, "byte array too long ({len})"), - Self::UnitCommand(..) => f.write_str("unit command not found"), - Self::BoolArrayLen(len) => write!(f, "boolean array too long ({len})"), - Self::Vec2ArrayLen(len) => write!(f, "vec2 array too long ({len})"), - } - } +impl fmt::Display for ReadError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Underlying(..) => f.write_str("failed to read from buffer"), + Self::Type(id) => write!(f, "invalid dynamic data type ({id})"), + Self::ContentType(..) => f.write_str("content type not found"), + Self::IntArrayLen(len) => write!(f, "integer array too long ({len})"), + Self::Point2ArrayLen(len) => write!(f, "point2 array too long ({len})"), + Self::LogicField(id) => write!(f, "invalid logic field ({id})"), + Self::ByteArrayLen(len) => write!(f, "byte array too long ({len})"), + Self::UnitCommand(..) => f.write_str("unit command not found"), + Self::BoolArrayLen(len) => write!(f, "boolean array too long ({len})"), + Self::Vec2ArrayLen(len) => write!(f, "vec2 array too long ({len})"), + } + } } -impl Error for ReadError -{ - fn source(&self) -> Option<&(dyn Error + 'static)> - { - match self - { - Self::Underlying(e) => Some(e), - _ => None, - } - } +impl Error for ReadError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + match self { + Self::Underlying(e) => Some(e), + _ => None, + } + } } #[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum WriteError -{ - Underlying(data::WriteError), - IntArrayLen(usize), - Point2ArrayLen(usize), - ByteArrayLen(usize), - BoolArrayLen(usize), - Vec2ArrayLen(usize), +pub enum WriteError { + Underlying(data::WriteError), + IntArrayLen(usize), + Point2ArrayLen(usize), + ByteArrayLen(usize), + BoolArrayLen(usize), + Vec2ArrayLen(usize), } -impl From<data::WriteError> for WriteError -{ - fn from(err: data::WriteError) -> Self - { - Self::Underlying(err) - } +impl From<data::WriteError> for WriteError { + fn from(err: data::WriteError) -> Self { + Self::Underlying(err) + } } -impl fmt::Display for WriteError -{ - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result - { - match self - { - Self::Underlying(..) => f.write_str("failed to write to buffer"), - Self::IntArrayLen(len) => write!(f, "integer array too long ({len})"), - Self::Point2ArrayLen(len) => write!(f, "point2 array too long ({len})"), - Self::ByteArrayLen(len) => write!(f, "byte array too long ({len})"), - Self::BoolArrayLen(len) => write!(f, "boolean array too long ({len})"), - Self::Vec2ArrayLen(len) => write!(f, "vec2 array too long ({len})"), - } - } +impl fmt::Display for WriteError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Underlying(..) => f.write_str("failed to write to buffer"), + Self::IntArrayLen(len) => write!(f, "integer array too long ({len})"), + Self::Point2ArrayLen(len) => write!(f, "point2 array too long ({len})"), + Self::ByteArrayLen(len) => write!(f, "byte array too long ({len})"), + Self::BoolArrayLen(len) => write!(f, "boolean array too long ({len})"), + Self::Vec2ArrayLen(len) => write!(f, "vec2 array too long ({len})"), + } + } } -impl Error for WriteError -{ - fn source(&self) -> Option<&(dyn Error + 'static)> - { - match self - { - Self::Underlying(e) => Some(e), - _ => None, - } - } +impl Error for WriteError { + fn source(&self) -> Option<&(dyn Error + 'static)> { + match self { + Self::Underlying(e) => Some(e), + _ => None, + } + } } #[cfg(test)] -mod test -{ - use super::*; - use crate::team::{CRUX, DERELICT, SHARDED}; - - macro_rules!_zero - { - ($tt:tt) => {0usize}; - } - - macro_rules!make_dyn_test +mod test { + use super::*; + use crate::team::{CRUX, DERELICT, SHARDED}; + + macro_rules! _zero { + ($tt:tt) => { + 0usize + }; + } + + macro_rules!make_dyn_test { ($name:ident, $($val:expr),+) => { @@ -541,26 +487,117 @@ mod test } }; } - - make_dyn_test!(reparse_empty, DynData::Empty, DynData::Empty, DynData::Empty); - make_dyn_test!(reparse_int, DynData::Int(581923), DynData::Int(2147483647), DynData::Int(-1047563850)); - make_dyn_test!(reparse_long, DynData::Long(11295882949812), DynData::Long(-5222358074010407789)); - make_dyn_test!(reparse_float, DynData::Float(3.14159265), DynData::Float(f32::INFINITY), DynData::Float(f32::EPSILON), DynData::Float(f32::NAN)); - make_dyn_test!(reparse_string, DynData::String(None), DynData::String(Some("hello \u{10FE03}".to_string())), DynData::String(Some("".to_string()))); - make_dyn_test!(reparse_content, DynData::Content(content::Type::Item, 12345), DynData::Content(content::Type::Planet, 25431)); - make_dyn_test!(reparse_int_array, DynData::IntArray(vec![581923, 2147483647, -1047563850]), DynData::IntArray(vec![1902864703])); - make_dyn_test!(reparse_point2, DynData::Point2(17, 0), DynData::Point2(234, -345), DynData::Point2(-2147483648, -1)); - make_dyn_test!(reparse_point2_array, DynData::Point2Array(vec![(44, 55), (-33, 66), (-22, -77)]), DynData::Point2Array(vec![(22, -88)])); - make_dyn_test!(reparse_technode, DynData::TechNode(content::Type::Item, 12345), DynData::TechNode(content::Type::Planet, 25431)); - make_dyn_test!(reparse_boolean, DynData::Boolean(false), DynData::Boolean(true), DynData::Boolean(false)); - make_dyn_test!(reparse_double, DynData::Double(2.718281828459045), DynData::Double(-f64::INFINITY), DynData::Double(f64::NAN)); - make_dyn_test!(reparse_building, DynData::Building(GridPos(10, 0)), DynData::Building(GridPos(4444, 0xFE98))); - make_dyn_test!(reparse_logic, DynData::LogicField(LogicField::Enabled), DynData::LogicField(LogicField::Shoot), DynData::LogicField(LogicField::Color)); - make_dyn_test!(reparse_byte_array, DynData::ByteArray(b"c\x00nstruct \xADditio\nal pylons".to_vec()), DynData::ByteArray(b"\x00\x01\xFE\xFF".to_vec())); - make_dyn_test!(reparse_unit_command, DynData::UnitCommand(UnitCommand::Idle), DynData::UnitCommand(UnitCommand::Rally)); - make_dyn_test!(reparse_bool_array, DynData::BoolArray(vec![true, true, true, false, true, false, true]), DynData::BoolArray(vec![false, true])); - make_dyn_test!(reparse_unit, DynData::Unit(0), DynData::Unit(2147483647)); - make_dyn_test!(reparse_vec2_array, DynData::Vec2Array(vec![(4.4, 5.5), (-3.3, 6.6), (-2.2, -7.7)]), DynData::Vec2Array(vec![(2.2, -8.8)])); - make_dyn_test!(reparse_vec2, DynData::Vec2(1.5, 9.1234), DynData::Vec2(-0.0, -17.0), DynData::Vec2(-10.7, 3.8)); - make_dyn_test!(reparse_team, DynData::Team(SHARDED), DynData::Team(CRUX), DynData::Team(DERELICT)); + + make_dyn_test!( + reparse_empty, + DynData::Empty, + DynData::Empty, + DynData::Empty + ); + make_dyn_test!( + reparse_int, + DynData::Int(581923), + DynData::Int(2147483647), + DynData::Int(-1047563850) + ); + make_dyn_test!( + reparse_long, + DynData::Long(11295882949812), + DynData::Long(-5222358074010407789) + ); + make_dyn_test!( + reparse_float, + DynData::Float(3.14159265), + DynData::Float(f32::INFINITY), + DynData::Float(f32::EPSILON), + DynData::Float(f32::NAN) + ); + make_dyn_test!( + reparse_string, + DynData::String(None), + DynData::String(Some("hello \u{10FE03}".to_string())), + DynData::String(Some("".to_string())) + ); + make_dyn_test!( + reparse_content, + DynData::Content(content::Type::Item, 12345), + DynData::Content(content::Type::Planet, 25431) + ); + make_dyn_test!( + reparse_int_array, + DynData::IntArray(vec![581923, 2147483647, -1047563850]), + DynData::IntArray(vec![1902864703]) + ); + make_dyn_test!( + reparse_point2, + DynData::Point2(17, 0), + DynData::Point2(234, -345), + DynData::Point2(-2147483648, -1) + ); + make_dyn_test!( + reparse_point2_array, + DynData::Point2Array(vec![(44, 55), (-33, 66), (-22, -77)]), + DynData::Point2Array(vec![(22, -88)]) + ); + make_dyn_test!( + reparse_technode, + DynData::TechNode(content::Type::Item, 12345), + DynData::TechNode(content::Type::Planet, 25431) + ); + make_dyn_test!( + reparse_boolean, + DynData::Boolean(false), + DynData::Boolean(true), + DynData::Boolean(false) + ); + make_dyn_test!( + reparse_double, + DynData::Double(2.718281828459045), + DynData::Double(-f64::INFINITY), + DynData::Double(f64::NAN) + ); + make_dyn_test!( + reparse_building, + DynData::Building(GridPos(10, 0)), + DynData::Building(GridPos(4444, 0xFE98)) + ); + make_dyn_test!( + reparse_logic, + DynData::LogicField(LogicField::Enabled), + DynData::LogicField(LogicField::Shoot), + DynData::LogicField(LogicField::Color) + ); + make_dyn_test!( + reparse_byte_array, + DynData::ByteArray(b"c\x00nstruct \xADditio\nal pylons".to_vec()), + DynData::ByteArray(b"\x00\x01\xFE\xFF".to_vec()) + ); + make_dyn_test!( + reparse_unit_command, + DynData::UnitCommand(UnitCommand::Idle), + DynData::UnitCommand(UnitCommand::Rally) + ); + make_dyn_test!( + reparse_bool_array, + DynData::BoolArray(vec![true, true, true, false, true, false, true]), + DynData::BoolArray(vec![false, true]) + ); + make_dyn_test!(reparse_unit, DynData::Unit(0), DynData::Unit(2147483647)); + make_dyn_test!( + reparse_vec2_array, + DynData::Vec2Array(vec![(4.4, 5.5), (-3.3, 6.6), (-2.2, -7.7)]), + DynData::Vec2Array(vec![(2.2, -8.8)]) + ); + make_dyn_test!( + reparse_vec2, + DynData::Vec2(1.5, 9.1234), + DynData::Vec2(-0.0, -17.0), + DynData::Vec2(-10.7, 3.8) + ); + make_dyn_test!( + reparse_team, + DynData::Team(SHARDED), + DynData::Team(CRUX), + DynData::Team(DERELICT) + ); } |