use crate::{
errors::ParseError,
packet::{
header::{Header, PacketFrequency},
packet::{Packet, PacketData},
packet_types::PacketType,
},
};
use byteorder::{LittleEndian, ReadBytesExt};
use std::io::{Cursor, Read};
impl Packet {
pub fn new_layer_data(layer_data: LayerData) -> Self {
Packet {
header: Header {
id: 11,
reliable: true,
zerocoded: false,
frequency: PacketFrequency::Low,
..Default::default()
},
body: PacketType::LayerData(Box::new(layer_data)),
}
}
}
#[derive(Debug, Clone)]
pub struct LayerData {
pub layer_type: LayerType,
pub stride: u16,
pub patch_size: u8,
pub layer_content: Vec<u8>,
}
#[derive(Debug, Clone, PartialEq)]
pub enum LayerType {
Land,
LandExtended,
Water,
WaterExtended,
Wind,
WindExtended,
Cloud,
CloudExtended,
Unknown,
}
impl LayerType {
pub fn to_bytes(&self) -> u8 {
match self {
LayerType::Land => 76,
LayerType::LandExtended => 77,
LayerType::Water => 87,
LayerType::WaterExtended => 88,
LayerType::Wind => 55,
LayerType::WindExtended => 57,
LayerType::Cloud => 56,
LayerType::CloudExtended => 58,
LayerType::Unknown => 0,
}
}
pub fn from_bytes(bytes: u8) -> Self {
match bytes {
76 => LayerType::Land,
77 => LayerType::LandExtended,
87 => LayerType::Water,
88 => LayerType::WaterExtended,
55 => LayerType::Wind,
57 => LayerType::WindExtended,
56 => LayerType::Cloud,
58 => LayerType::CloudExtended,
_ => LayerType::Unknown,
}
}
}
impl PacketData for LayerData {
fn from_bytes(bytes: &[u8]) -> Result<Self, ParseError> {
let mut cursor = Cursor::new(bytes);
let layer_type_bytes = cursor.read_u8()?;
let layer_type = LayerType::from_bytes(layer_type_bytes);
let _data_size = cursor.read_u16::<LittleEndian>()?;
let stride = cursor.read_u16::<LittleEndian>()?;
let patch_size = cursor.read_u8()?;
let _layer_type = cursor.read_u8();
let mut layer_content = Vec::new();
cursor.read_to_end(&mut layer_content)?;
let data = LayerData {
stride,
patch_size,
layer_type,
layer_content,
};
Ok(data)
}
fn to_bytes(&self) -> Vec<u8> {
Vec::new()
}
}