backroll 0.6.0

A pure Rust async implementation of GGPO.
Documentation
use super::ConnectionStatus;
use crate::{time_sync::UnixMillis, Frame};
use serde::{Deserialize, Serialize};
use std::num::Wrapping;

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct Message {
    pub magic: u16,
    pub sequence_number: Wrapping<u16>,
    pub data: MessageData,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) enum MessageData {
    KeepAlive,
    SyncRequest(SyncRequest),
    SyncReply(SyncReply),
    Input(Input),
    InputAck(InputAck),
    QualityReport(QualityReport),
    QualityReply(QualityReply),
}

impl MessageData {
    pub fn is_sync_message(&self) -> bool {
        matches!(self, Self::SyncRequest(_) | Self::SyncReply(_))
    }
}

impl From<SyncRequest> for MessageData {
    fn from(value: SyncRequest) -> Self {
        Self::SyncRequest(value)
    }
}

impl From<SyncReply> for MessageData {
    fn from(value: SyncReply) -> Self {
        Self::SyncReply(value)
    }
}

impl From<Input> for MessageData {
    fn from(value: Input) -> Self {
        Self::Input(value)
    }
}

impl From<InputAck> for MessageData {
    fn from(value: InputAck) -> Self {
        Self::InputAck(value)
    }
}

impl From<QualityReport> for MessageData {
    fn from(value: QualityReport) -> Self {
        Self::QualityReport(value)
    }
}

impl From<QualityReply> for MessageData {
    fn from(value: QualityReply) -> Self {
        Self::QualityReply(value)
    }
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct Input {
    pub peer_connect_status: Vec<ConnectionStatus>,
    pub start_frame: Frame,
    pub ack_frame: Frame,
    pub bits: Vec<u8>,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct InputAck {
    pub ack_frame: Frame,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct SyncRequest {
    pub random: u32,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct SyncReply {
    pub random: u32,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct QualityReport {
    pub frame_advantage: i32,
    pub ping: UnixMillis,
}

#[derive(Clone, Debug, Serialize, Deserialize)]
pub(super) struct QualityReply {
    pub pong: UnixMillis,
}