use super::kind::PacketType;
use super::PayloadTrait;
#[derive(Eq, PartialEq, Nom, Serialize)]
#[nom(BigEndian)]
#[cfg_attr(test, derive(test_strategy::Arbitrary))]
pub struct Write {
pub id: u32,
#[nom(Parse(crate::util::parse_uuid))]
#[serde(serialize_with = "crate::util::serialize_uuid")]
#[cfg_attr(test, strategy(crate::util::arbitrary_uuid()))]
pub handle: uuid::Uuid,
pub offset: u64,
#[nom(Parse(crate::util::parse_u8_vec))]
#[serde(serialize_with = "crate::util::vec_with_u32_length")]
pub data: Vec<u8>,
}
impl PayloadTrait for Write {
const Type: PacketType = PacketType::Write;
fn binsize(&self) -> u32 {
4 + (4 + 36) + 8 + (4 + self.data.len() as u32)
}
}
impl From<Write> for super::Payload {
fn from(p: Write) -> Self {
Self::Write(p)
}
}
impl std::fmt::Debug for Write {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Write")
.field("id", &self.id)
.field("handle", &self.handle)
.field("offset", &self.offset)
.field("data", &format!("[u8; {}]", self.data.len()))
.finish()
}
}
#[cfg(test)]
mod tests {
use test_strategy::proptest;
use crate::parser::encode;
use crate::parser::Parser;
use super::*;
#[proptest]
fn roundtrip_whole(input: Write) {
let mut stream = Parser::default();
let packet = input.into_packet();
stream.write(&encode(&packet)).unwrap();
assert_eq!(stream.get_packet(), Ok(Some(packet)));
assert_eq!(stream.get_packet(), Ok(None));
}
}