extern crate alloc;
use alloc::string::String;
use alloc::vec::Vec;
use zerodds_cdr::buffer::{BufferReader, BufferWriter};
use zerodds_cdr::endianness::Endianness;
use crate::dds_type::{DdsType, DecodeError, EncodeError};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ShapeType {
pub color: String,
pub x: i32,
pub y: i32,
pub shapesize: i32,
}
impl ShapeType {
#[must_use]
pub fn new(color: impl Into<String>, x: i32, y: i32, shapesize: i32) -> Self {
Self {
color: color.into(),
x,
y,
shapesize,
}
}
}
impl DdsType for ShapeType {
const TYPE_NAME: &'static str = "ShapeType";
const HAS_KEY: bool = true;
fn encode_key_holder_be(&self, holder: &mut crate::dds_type::PlainCdr2BeKeyHolder) {
holder.write_string(&self.color);
}
fn encode(&self, out: &mut Vec<u8>) -> core::result::Result<(), EncodeError> {
let mut w = BufferWriter::new(Endianness::Little);
w.write_string(&self.color)
.map_err(|_| EncodeError::Invalid {
what: "ShapeType.color encoding",
})?;
w.write_u32(self.x as u32)
.map_err(|_| EncodeError::Invalid {
what: "ShapeType.x encoding",
})?;
w.write_u32(self.y as u32)
.map_err(|_| EncodeError::Invalid {
what: "ShapeType.y encoding",
})?;
w.write_u32(self.shapesize as u32)
.map_err(|_| EncodeError::Invalid {
what: "ShapeType.shapesize encoding",
})?;
out.extend_from_slice(w.as_bytes());
Ok(())
}
fn decode(bytes: &[u8]) -> core::result::Result<Self, DecodeError> {
let mut r = BufferReader::new(bytes, Endianness::Little);
let color = r.read_string().map_err(|_| DecodeError::Invalid {
what: "ShapeType.color decoding",
})?;
let x = r.read_u32().map_err(|_| DecodeError::Invalid {
what: "ShapeType.x decoding",
})? as i32;
let y = r.read_u32().map_err(|_| DecodeError::Invalid {
what: "ShapeType.y decoding",
})? as i32;
let shapesize = r.read_u32().map_err(|_| DecodeError::Invalid {
what: "ShapeType.shapesize decoding",
})? as i32;
Ok(Self {
color,
x,
y,
shapesize,
})
}
}