sftp_protocol/packet/
data.rs

1use super::kind::PacketType;
2use super::PayloadTrait;
3
4#[derive(Debug, Eq, PartialEq, Nom, Serialize)]
5#[nom(BigEndian)]
6#[cfg_attr(test, derive(test_strategy::Arbitrary))]
7pub struct Data {
8	pub id: u32,
9	#[nom(Parse(crate::util::parse_u8_vec))]
10	#[serde(serialize_with = "crate::util::vec_with_u32_length")]
11	pub data: Vec<u8>
12}
13
14impl PayloadTrait for Data {
15	const Type: PacketType = PacketType::Data;
16	fn binsize(&self) -> u32 {
17		4 + (4 + self.data.len() as u32)
18	}
19}
20
21impl From<Data> for super::Payload {
22	fn from(p: Data) -> Self {
23		Self::Data(p)
24	}
25}
26
27#[cfg(test)]
28mod tests {
29	use test_strategy::proptest;
30	use crate::parser::encode;
31	use crate::parser::Parser;
32	use super::*;
33
34	#[proptest]
35	fn roundtrip_whole(input: Data) {
36		let mut stream = Parser::default();
37		let packet = input.into_packet();
38		stream.write(&encode(&packet)).unwrap();
39		assert_eq!(stream.get_packet(), Ok(Some(packet)));
40		assert_eq!(stream.get_packet(), Ok(None));
41	}
42}
43