use std::fmt;
use std::fmt::Display;
use std::time::Duration;
use derive_new::new;
use getset::{CopyGetters, Getters};
use crate::packet::header::Header;
use crate::types::VehicleIndex;
#[derive(
new, Debug, Getters, CopyGetters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash, Default,
)]
pub struct FastestLap {
#[getset(get_copy = "pub")]
vehicle_index: VehicleIndex,
#[getset(get = "pub")]
time: Duration,
}
impl Display for FastestLap {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"{}s by car #{}",
self.time.as_secs_f32(),
self.vehicle_index
)
}
}
#[derive(
new, Debug, Getters, CopyGetters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash, Default,
)]
pub struct Retirement {
#[getset(get_copy = "pub")]
vehicle_index: VehicleIndex,
}
impl Display for Retirement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "retirement of car #{}", self.vehicle_index)
}
}
#[derive(
new, Debug, Getters, CopyGetters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash, Default,
)]
pub struct TeammateInPits {
#[getset(get_copy = "pub")]
vehicle_index: VehicleIndex,
}
impl Display for TeammateInPits {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "teammate in car #{} in pits", self.vehicle_index)
}
}
#[derive(
new, Debug, Getters, CopyGetters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash, Default,
)]
pub struct RaceWinner {
#[getset(get_copy = "pub")]
vehicle_index: VehicleIndex,
}
impl Display for RaceWinner {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "race winner in car #{}", self.vehicle_index)
}
}
#[derive(Debug, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash)]
pub enum Event {
ChequeredFlag,
DrsDisabled,
DrsEnabled,
FastestLap(FastestLap),
RaceWinner(RaceWinner),
Retirement(Retirement),
SessionEnded,
SessionStarted,
TeammatesInPits(TeammateInPits),
}
impl Default for Event {
fn default() -> Self {
Event::SessionStarted
}
}
impl Display for Event {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Event::SessionStarted => write!(f, "Session started"),
Event::SessionEnded => write!(f, "Session ended"),
Event::FastestLap(lap) => write!(
f,
"Fastest lap by car #{} ({}s)",
lap.vehicle_index,
lap.time.as_secs_f32()
),
Event::Retirement(retirement) => write!(f, "Car #{} retired", retirement.vehicle_index),
Event::DrsEnabled => write!(f, "DRS enabled"),
Event::DrsDisabled => write!(f, "DRS disabled"),
Event::TeammatesInPits(teammate) => {
write!(f, "Teammate in car #{} in pits", teammate.vehicle_index)
}
Event::ChequeredFlag => write!(f, "Chequered flag"),
Event::RaceWinner(winner) => write!(f, "Car #{} won the race", winner.vehicle_index),
}
}
}
#[derive(new, Debug, Getters, PartialEq, Copy, Clone, Eq, Ord, PartialOrd, Hash)]
pub struct EventPacket {
#[getset(get = "pub")]
header: Header,
#[getset(get = "pub")]
event: Event,
}
impl Display for EventPacket {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"EventPacket {{ header: {}, event: {} }}",
self.header, self.event
)
}
}