Automatically generate safe byte (de)serialize code for you at compile-time.
#[derive(Copy,Clone,BinEncode,PartialEq)]#[binstruct(enum_repr(u8))]enumGameStatus{#[binstruct(value = 1)]Pending,#[binstruct(value = 2)]Started,}#[derive(BinEncode,BinDecode)]structSlot{player_id:u8,}#[derive(BinEncode,BinDecode)]structPlayer{id:u8,name:CString,}#[derive(BinEncode,BinDecode)]structGame{#[binstruct(eq = 0xF7)]magic:u8,version:u8,name:CString,num_players:u8,#[binstruct(repeat = "num_players")]players:Vec<Player>,slots:[Slot;24],#[binstruct(condition = "version == 2")]v2_field:Option<u8>,}will generate
#[binstruct(enum_repr(u8))]enumGameStatus{#[binstruct(value = 1)]Pending,#[binstruct(value = 2)]Started,}impl binstruct::serialize::BinEncodeforGameStatus{fnencode<T: binstruct::serialize::BufMut>(&self,buf:&mutT){
<u8as binstruct::serialize::BinEncode>::encode(&u8::from(*self), buf);}}implFrom<GameStatus>foru8{fnfrom(v:GameStatus) -> u8{match v {GameStatus::Pending => 1,GameStatus::Started => 2,}}}structSlot{player_id:u8,}impl binstruct::serialize::BinEncodeforSlot{fnencode<T: binstruct::serialize::BufMut>(&self,buf:&mutT){
<u8as binstruct::serialize::BinEncode>::encode(&self.player_id, buf);}}impl binstruct::serialize::BinDecodeforSlot{constMIN_SIZE:usize = <u8as binstruct::serialize::BinDecode>::MIN_SIZE;constFIXED_SIZE:bool = <u8as binstruct::serialize::BinDecode>::FIXED_SIZE;fndecode<T: binstruct::serialize::Buf>(buf:&mutT,) -> Result<Self, binstruct::serialize::BinDecodeError>{if buf.remaining() < Self::MIN_SIZE{returnErr(binstruct::serialize::BinDecodeError::incomplete());}let player_id = { <u8as binstruct::serialize::BinDecode>::decode(buf)? };Ok(Self{ player_id })}}structPlayer{id:u8,name:CString,}impl binstruct::serialize::BinEncodeforPlayer{fnencode<T: binstruct::serialize::BufMut>(&self,buf:&mutT){
<u8as binstruct::serialize::BinEncode>::encode(&self.id, buf);
<CStringas binstruct::serialize::BinEncode>::encode(&self.name, buf);}}impl binstruct::serialize::BinDecodeforPlayer{constMIN_SIZE:usize = <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ <CStringas binstruct::serialize::BinDecode>::MIN_SIZE;constFIXED_SIZE:bool = <u8as binstruct::serialize::BinDecode>::FIXED_SIZE
&& <CStringas binstruct::serialize::BinDecode>::FIXED_SIZE;fndecode<T: binstruct::serialize::Buf>(buf:&mutT,) -> Result<Self, binstruct::serialize::BinDecodeError>{if buf.remaining() < Self::MIN_SIZE{returnErr(binstruct::serialize::BinDecodeError::incomplete());}let id = { <u8as binstruct::serialize::BinDecode>::decode(buf)? };let name = {if <CStringas binstruct::serialize::BinDecode>::MIN_SIZE > 0
&& !<u8as binstruct::serialize::BinDecode>::FIXED_SIZE{if buf.remaining() < <CStringas binstruct::serialize::BinDecode>::MIN_SIZE{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}
<CStringas binstruct::serialize::BinDecode>::decode(buf)?
};Ok(Self{ id, name })}}structGame{#[binstruct(eq = 0xF7)]magic:u8,version:u8,name:CString,num_players:u8,#[binstruct(repeat = "num_players")]players:Vec<Player>,slots:[Slot;24],#[binstruct(condition = "version == 2")]v2_field:Option<u8>,}impl binstruct::serialize::BinEncodeforGame{fnencode<T: binstruct::serialize::BufMut>(&self,buf:&mutT){
<u8as binstruct::serialize::BinEncode>::encode(&self.magic, buf);
<u8as binstruct::serialize::BinEncode>::encode(&self.version, buf);
<CStringas binstruct::serialize::BinEncode>::encode(&self.name, buf);
<u8as binstruct::serialize::BinEncode>::encode(&self.num_players, buf);
<Vec<Player>as binstruct::serialize::BinEncode>::encode(&self.players, buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[0usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[1usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[2usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[3usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[4usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[5usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[6usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[7usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[8usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[9usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[10usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[11usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[12usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[13usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[14usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[15usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[16usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[17usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[18usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[19usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[20usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[21usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[22usize], buf);
<Slotas binstruct::serialize::BinEncode>::encode(&self.slots[23usize], buf);ifself.version == 2{ifletSome(ref v2_field) = self.v2_field{
<u8as binstruct::serialize::BinEncode>::encode(v2_field, buf);}}}}impl binstruct::serialize::BinDecodeforGame{constMIN_SIZE:usize = <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ <CStringas binstruct::serialize::BinDecode>::MIN_SIZE
+ <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0;constFIXED_SIZE:bool = <u8as binstruct::serialize::BinDecode>::FIXED_SIZE
&& <u8as binstruct::serialize::BinDecode>::FIXED_SIZE
&& <CStringas binstruct::serialize::BinDecode>::FIXED_SIZE
&& <u8as binstruct::serialize::BinDecode>::FIXED_SIZE
&& false
&& <Slotas binstruct::serialize::BinDecode>::FIXED_SIZE
&& false;fndecode<T: binstruct::serialize::Buf>(buf:&mutT,) -> Result<Self, binstruct::serialize::BinDecodeError>{if buf.remaining() < Self::MIN_SIZE{returnErr(binstruct::serialize::BinDecodeError::incomplete());}let magic = { <u8as binstruct::serialize::BinDecode>::decode(buf)? };if magic != 0xF7{returnErr(binstruct::serialize::BinDecodeError::failure({let res = ::alloc::fmt::format(::core::fmt::Arguments::new_v1(&["unexpected value for field `","`, expected `","`, got `","`",],&match(&"magic",&0xF7,&magic){(arg0, arg1, arg2) => [::core::fmt::ArgumentV1::new(arg0,::core::fmt::Display::fmt),::core::fmt::ArgumentV1::new(arg1,::core::fmt::Debug::fmt),::core::fmt::ArgumentV1::new(arg2,::core::fmt::Debug::fmt),],},));
res
}));}let version = {if <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ <CStringas binstruct::serialize::BinDecode>::MIN_SIZE
+ <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0
> 0
&& !<u8as binstruct::serialize::BinDecode>::FIXED_SIZE{if buf.remaining()
< <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ <CStringas binstruct::serialize::BinDecode>::MIN_SIZE
+ <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}
<u8as binstruct::serialize::BinDecode>::decode(buf)?
};let name = {if <CStringas binstruct::serialize::BinDecode>::MIN_SIZE
+ <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0
> 0
&& !<u8as binstruct::serialize::BinDecode>::FIXED_SIZE{if buf.remaining()
< <CStringas binstruct::serialize::BinDecode>::MIN_SIZE
+ <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}
<CStringas binstruct::serialize::BinDecode>::decode(buf)?
};let num_players = {if <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0
> 0
&& !<CStringas binstruct::serialize::BinDecode>::FIXED_SIZE{if buf.remaining()
< <u8as binstruct::serialize::BinDecode>::MIN_SIZE
+ 0
+ (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24))
+ 0{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}
<u8as binstruct::serialize::BinDecode>::decode(buf)?
};let players = {if0 + (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24)) + 0 > 0
&& !<u8as binstruct::serialize::BinDecode>::FIXED_SIZE{if buf.remaining()
< 0 + (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24)) + 0{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}
binstruct::serialize::BinBufExt::get_repeated(buf,(num_players)asusize)?
};let slots = {if(<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24)) + 0 > 0 && !false{if buf.remaining()
< (<Slotas binstruct::serialize::BinDecode>::MIN_SIZE*(24)) + 0{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}[
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,
<Slotas binstruct::serialize::BinDecode>::decode(buf)?,]};let v2_field = {if0 > 0 && !<Slotas binstruct::serialize::BinDecode>::FIXED_SIZE{if buf.remaining() < 0{returnErr(binstruct::serialize::BinDecodeError::incomplete());}}if version == 2{if <u8as binstruct::serialize::BinDecode>::MIN_SIZE > 0
&& buf.remaining() < <u8as binstruct::serialize::BinDecode>::MIN_SIZE{returnErr(binstruct::serialize::BinDecodeError::incomplete());}Some(<u8as binstruct::serialize::BinDecode>::decode(buf)?)}else{None}};Ok(Self{
magic,
version,
name,
num_players,
players,
slots,
v2_field,})}}