bytezy 0.0.1

Helps you deserialize bytes into structs and enums
Documentation
RSProtoMessage {
	0x60
	length u16
	command u8 [
		0x2A => Cmd
		0x33 => Req
		0x66 => Data
		// we use RSProtoMessageResponse to deserialize the response
		// since even by checking the length you can't be 100% sure 
		// you're deserializing a response
		// 0xAA if length == 11 => DblResponse
		0xAA => Dbl
	]
	crc u16
}

RSProtoMessageDblResponse {
	0x60
	length u16
	// Dbl identifier
	0xAA
	data DblResponse
	crc 16
}

Cmd {
	flag u8 [
		0x00 => Polling
		0x01 => Ack
		0x02 => Nack
	]
}

Ack {}

Polling {}

Nack {
	error u16
}

Req {
	// only allowed types are file_identifier variable_identifier ticket_identifier
	identifier GenericData
}

Data {
	ticket u32 [
		0xFFFFFFFF => DataInvalidTicketId
		0xFFFFFFFE => DataUnconnectedTicketId
		ticket => DataValidTicket<ticket>
	]
}

DataInvalidTicketId {
	data GenericVariable
}

DataUnconnectedTicketId {
	// the first field of a data unconnected ticket response is fixed to 4 byte length
	element GenericVariable<4>
	// the second field can be any lenght
	data GenericVariable
}

DataValidTicket<TicketId u32> {
	ticket u32 = TicketId
}

DblResponse {
	// First block number
	0x000000
	size_recv u16
	max_size_fin u16
}

Dbl {
	block_n u8[3] [
		0x000000 => FirstBlockDbl
		0xFFFFFF => LastBlockDbl
		block_n => BlockDbl<block_n>
	]
}

FirstBlockDbl {
	max_size u16
	data GenericVariable
}

BlockDbl<BlockNumber u32> {
	block_n u32 = BlockNumber
}

LastBlockDbl {
	
}

#use MESSAGE_LENGTH

GenericVariable<Size = MESSAGE_LENGTH - 2> {
	type u8 [
		0x01 => positive_int u32
		0x02 => negative_int u32
		// 4 byte + 1 byte decimal part (needs conversion)
		0x03 => positive_dec u8[5]
		// 4 byte + 1 byte decimal part (needs conversion)
		0x04 => negative_dec u8[5]
		0x05 => file_identifier u16
		0x06 => variable_identifier u32
		0x07 => string u8[<Size>]
		0x10 => buffer u8[<Size>]
		0x11 => Void
		0x80 => ticket_identifier u32
	]
}

Void {}