use std::io::{self, BufRead};
use crate::pgp::{
errors::{ensure_eq, Result},
packet::{PacketHeader, PacketTrait},
parsing_reader::BufReadParsing,
ser::Serialize,
};
const PGP: [u8; 3] = [0x50, 0x47, 0x50];
#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(test, derive(proptest_derive::Arbitrary))]
pub struct Marker {
packet_header: PacketHeader,
}
impl Marker {
pub fn try_from_reader<B: BufRead>(packet_header: PacketHeader, mut input: B) -> Result<Self> {
let marker = input.read_array::<3>()?;
ensure_eq!(marker, PGP, "invalid input");
Ok(Marker { packet_header })
}
}
impl Serialize for Marker {
fn to_writer<W: io::Write>(&self, writer: &mut W) -> Result<()> {
writer.write_all(&PGP[..])?;
Ok(())
}
fn write_len(&self) -> usize {
PGP.len()
}
}
impl PacketTrait for Marker {
fn packet_header(&self) -> &PacketHeader {
&self.packet_header
}
}
#[cfg(test)]
mod tests {
use proptest::prelude::*;
use super::*;
proptest! {
#[test]
fn write_len(marker: Marker) {
let mut buf = Vec::new();
marker.to_writer(&mut buf).unwrap();
assert_eq!(buf.len(), marker.write_len());
}
#[test]
fn packet_roundtrip(marker: Marker) {
let mut buf = Vec::new();
marker.to_writer(&mut buf).unwrap();
let new_marker = Marker::try_from_reader(marker.packet_header, &mut &buf[..]).unwrap();
assert_eq!(marker, new_marker);
}
}
}