use speedy::{Readable, Writable};
use crate::{
messages::{
protocol_id::ProtocolId, protocol_version::ProtocolVersion, validity_trait::Validity,
vendor_id::VendorId,
},
structure::guid::GuidPrefix,
};
#[derive(Debug, Clone, Copy, Readable, Writable, PartialEq, Eq)]
pub struct Header {
pub protocol_id: ProtocolId,
pub protocol_version: ProtocolVersion,
pub vendor_id: VendorId,
pub guid_prefix: GuidPrefix,
}
impl Header {
pub fn new(guid: GuidPrefix) -> Self {
Self {
protocol_id: ProtocolId::PROTOCOL_RTPS,
protocol_version: ProtocolVersion::THIS_IMPLEMENTATION,
vendor_id: VendorId::THIS_IMPLEMENTATION,
guid_prefix: guid,
}
}
}
impl Validity for Header {
fn valid(&self) -> bool {
self.protocol_id == ProtocolId::PROTOCOL_RTPS && self.protocol_version.major <= ProtocolVersion::THIS_IMPLEMENTATION.major
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn header_protocol_version_major() {
let mut header = Header::new(GuidPrefix::UNKNOWN);
header.protocol_version = ProtocolVersion::PROTOCOLVERSION_1_0;
assert!(header.valid());
header.protocol_version = ProtocolVersion::THIS_IMPLEMENTATION;
assert!(header.valid());
header.protocol_version.major += 1;
assert!(!header.valid());
}
#[test]
fn header_protocol_id_same_as_rtps() {
let mut header = Header::new(GuidPrefix::UNKNOWN);
header.protocol_id = ProtocolId::PROTOCOL_RTPS;
assert!(header.valid());
}
serialization_test!( type = Header,
{
header_with_unknown_guid_prefix,
Header::new(GuidPrefix::UNKNOWN),
le = [0x52, 0x54, 0x50, 0x53, 0x02, 0x04, 0x01, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00],
be = [0x52, 0x54, 0x50, 0x53,
0x02, 0x04,
0x01, 0x12,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00]
});
}