use std::fmt;
use std::fmt::Display;
use std::time::Duration;
use derive_new::new;
use getset::{CopyGetters, Getters};
use crate::types::VehicleIndex;
#[derive(Debug, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash)]
pub enum ApiSpec {
Nineteen,
}
#[derive(Debug, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash)]
pub enum PacketType {
Event,
Lap,
Motion,
Participants,
Session,
Setup,
Status,
Telemetry,
}
#[derive(
new, Debug, Getters, CopyGetters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash, Default,
)]
pub struct GameVersion {
#[getset(get_copy = "pub")]
major: u8,
#[getset(get_copy = "pub")]
minor: u8,
}
impl Display for GameVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}.{}", self.major, self.minor)
}
}
#[derive(new, Debug, Getters, CopyGetters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash)]
pub struct Header {
#[getset(get_copy = "pub")]
api_spec: ApiSpec,
#[getset(get = "pub")]
game_version: Option<GameVersion>,
#[getset(get_copy = "pub")]
packet_type: PacketType,
#[getset(get_copy = "pub")]
session_uid: u64,
#[getset(get = "pub")]
session_time: Duration,
#[getset(get_copy = "pub")]
frame_identifier: u32,
#[getset(get_copy = "pub")]
player_car_index: VehicleIndex,
}
impl Display for Header {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let game_version = match self.game_version {
Some(version) => format!("{}", version),
None => String::from("None"),
};
write!(
f,
"Header {{ game_version: {}, session: {}, time: {}s, frame: {}, player_car_index: {} }}",
game_version,
self.session_uid,
self.session_time.as_secs(),
self.frame_identifier,
self.player_car_index
)
}
}