use sha2_const_stable::Sha256;
use crate::protocol::headers::{LocalPacketHeader, SparklesMachineInfo};
use crate::protocol::sender::Sender;
#[derive(Copy, Clone, Debug, PartialEq)]
#[repr(u8)]
pub enum PacketType {
MachineInfo,
DataBytes,
FailedPages,
TimestampFreq,
GracefulShutdown,
ConnectionAccepted,
}
impl PacketType {
pub const fn get_str(&self) -> &str {
match self {
PacketType::MachineInfo => "MachineInfo",
PacketType::DataBytes => "DataBytes",
PacketType::FailedPages => "FailedPages",
PacketType::TimestampFreq => "TimestampFreq",
PacketType::GracefulShutdown => "GracefulShutdown",
PacketType::ConnectionAccepted => "ConnectionAccepted",
}
}
pub const fn pattern(&self) -> [u8; 32] {
let str = self.get_str();
Sha256::new().update(str.as_bytes()).finalize()
}
pub fn try_from_pattern(pattern: &[u8]) -> Option<Self> {
if pattern == Self::MachineInfo.pattern() {
Some(Self::MachineInfo)
}
else if pattern == Self::DataBytes.pattern() {
Some(Self::DataBytes)
}
else if pattern == Self::FailedPages.pattern() {
Some(Self::FailedPages)
}
else if pattern == Self::TimestampFreq.pattern() {
Some(Self::TimestampFreq)
}
else if pattern == Self::GracefulShutdown.pattern() {
Some(Self::GracefulShutdown)
}
else if pattern == Self::ConnectionAccepted.pattern() {
Some(Self::ConnectionAccepted)
}
else {
None
}
}
}
#[derive(Copy, Clone, Debug)]
#[repr(u8)]
pub enum RequestPacketType {
Subscribe,
}
impl RequestPacketType {
pub const fn get_str(&self) -> &str {
match self {
RequestPacketType::Subscribe => "Subscribe",
}
}
pub const fn pattern(&self) -> [u8; 32] {
let str = self.get_str();
Sha256::new().update(str.as_bytes()).finalize()
}
}
pub fn send_machine_info(sender: &mut impl Sender, sparkles_encoder_info: SparklesMachineInfo) {
let encoded_info = bincode::encode_to_vec(&sparkles_encoder_info, bincode::config::standard()).unwrap();
sender.send_packet(PacketType::MachineInfo, &[&encoded_info]);
}
pub fn send_trace_data(sender: &mut impl Sender, slice1: &[u8], slice2: &[u8]) {
sender.send_packet(PacketType::DataBytes, &[slice1, slice2]);
}
pub fn send_failed_pages(sender: &mut impl Sender, failed_pages: &[LocalPacketHeader]) {
let header = bincode::encode_to_vec(failed_pages, bincode::config::standard()).unwrap();
sender.send_packet(PacketType::FailedPages, &[&header]);
}
pub fn send_timestamp_freq(sender: &mut impl Sender, ticks_per_sec: u64, cur_tm: u64) {
let freq_bytes = ticks_per_sec.to_be_bytes();
let tm_bytes = cur_tm.to_be_bytes();
sender.send_packet(PacketType::TimestampFreq, &[&freq_bytes, &tm_bytes]);
}
pub fn send_graceful_shutdown(sender: &mut impl Sender) {
sender.send_packet(PacketType::GracefulShutdown, &[]);
}