use crate::identifier::Identifier; use std::fmt::Debug; use std::io; use packet_data::PacketData; use crate::packet::raw_packet::RawPacket; /// High level abstraction for packet data. pub mod packet_data; /// Low level abstraction for packets. pub mod raw_packet; /// Size of the packet header. pub const PACKET_HEADER_SIZE: usize = 20; /// Packet size with CRC32. pub const FULL_PACKET_SIZE: usize = 65559; /// Packet size without CRC32. pub const BASE_PACKET_SIZE: usize = 65555; /// The abstraction for all DomoProto packets. #[derive(Debug, Clone, PartialEq, Eq)] pub struct Packet { pub dest: Identifier, pub src: Identifier, pub packet_id: Identifier, pub reply_to: Identifier, pub command: u8, pub data: PacketData, } pub trait ToPacket { fn to_packet(self, src: Identifier, dest: Identifier, packet_id: Identifier, reply_to: Identifier) -> Packet; } /// Default packet is a ping from 0x0 to 0xFFFFFFFF impl Default for Packet { fn default() -> Self { Self { dest: Identifier::from(0xFFFFFFFF), src: Identifier::from(0), command: 0x00, packet_id: Identifier::default(), reply_to: Identifier::default(), data: PacketData::NodeManagement(crate::commands::node_management::NodeManagementCommand::Ping) } } } /// Secretly calls RawPacket::try_from().into() impl TryFrom> for Packet { type Error = io::Error; fn try_from(data: Vec) -> io::Result { Ok(RawPacket::try_from(data)?.into()) } } impl Into> for Packet { fn into(self) -> Vec { RawPacket::from(self).into() } }