sftp-protocol 0.1.0

A pure Rust implementation of the SFTP protocol
Documentation
use super::kind::PacketType;
use super::PayloadTrait;

#[derive(Debug, Eq, PartialEq, Nom, Serialize)]
#[nom(BigEndian)]
#[cfg_attr(test, derive(test_strategy::Arbitrary))]
pub struct Request {
	pub id: u32,
	#[nom(Parse(crate::util::parse_string))]
	#[serde(serialize_with = "crate::util::str_with_u32_length")]
	pub request: String,
	#[nom(Parse(crate::util::parse_u8_vec))]
	#[serde(serialize_with = "crate::util::vec_with_u32_length")]
	pub data: Vec<u8>
}

impl PayloadTrait for Request {
	const Type: PacketType = PacketType::Extended;
	fn binsize(&self) -> u32 {
		4 + (4 + self.request.len() as u32) + (4 + self.data.len() as u32)
	}
}

impl From<Request> for super::Payload {
	fn from(p: Request) -> Self {
		Self::Extended(p)
	}
}

#[derive(Debug, Eq, PartialEq, Nom, Serialize)]
#[nom(BigEndian)]
#[cfg_attr(test, derive(test_strategy::Arbitrary))]
pub struct Response {
	pub id: u32,
	#[nom(Parse(crate::util::parse_u8_vec))]
	#[serde(serialize_with = "crate::util::vec_with_u32_length")]
	pub data: Vec<u8>
}

impl PayloadTrait for Response {
	const Type: PacketType = PacketType::ExtendedReply;
	fn binsize(&self) -> u32 {
		4 + (4 + self.data.len() as u32)
	}
}

impl From<Response> for super::Payload {
	fn from(p: Response) -> Self {
		Self::ExtendedReply(p)
	}
}

#[cfg(test)]
mod tests {
	use test_strategy::proptest;
	use crate::parser::encode;
	use crate::parser::Parser;
	use super::*;

	#[proptest]
	fn roundtrip_request_whole(input: Request) {
		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));
	}

	#[proptest]
	fn roundtrip_response_whole(input: Response) {
		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));
	}
}