#![doc = include_str!("../../docs/game/stat.md")]
#[cfg(feature = "rocket_okapi")]
use rocket_okapi::okapi::schemars;
#[cfg(feature = "rocket_okapi")]
use rocket_okapi::okapi::schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[cfg(feature = "wasm")]
use tsify_next::Tsify;
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[cfg_attr(feature = "wasm", derive(Tsify))]
#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Default, Serialize, Deserialize)]
pub struct RushingStats {
rushes: u32,
fumbles: u32,
touchdowns: u32,
yards: i32
}
impl RushingStats {
pub fn new() -> RushingStats {
RushingStats::default()
}
pub fn rushes(&self) -> u32 {
self.rushes
}
pub fn increment_rushes(&mut self, rushes: u32) {
self.rushes += rushes;
}
pub fn fumbles(&self) -> u32 {
self.fumbles
}
pub fn increment_fumbles(&mut self, fumbles: u32) {
self.fumbles += fumbles;
}
pub fn touchdowns(&self) -> u32 {
self.touchdowns
}
pub fn increment_touchdowns(&mut self, touchdowns: u32) {
self.touchdowns += touchdowns;
}
pub fn yards(&self) -> i32 {
self.yards
}
pub fn increment_yards(&mut self, yards: i32) {
self.yards += yards;
}
}
impl std::fmt::Display for RushingStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut rushing_str = format!(
"{} rush, {} yards",
self.rushes,
self.yards
);
if self.touchdowns > 0 {
rushing_str = format!(
"{}, {} TD",
rushing_str,
self.touchdowns
);
}
if self.fumbles > 0 {
rushing_str = format!(
"{}, {} FUM",
rushing_str,
self.fumbles
);
}
f.write_str(&rushing_str)
}
}
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[cfg_attr(feature = "wasm", derive(Tsify))]
#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Default, Serialize, Deserialize)]
pub struct PassingStats {
attempts: u32,
completions: u32,
touchdowns: u32,
interceptions: u32,
yards: i32
}
impl PassingStats {
pub fn new() -> PassingStats {
PassingStats::default()
}
pub fn attempts(&self) -> u32 {
self.attempts
}
pub fn increment_attempts(&mut self, attempts: u32) {
self.attempts += attempts;
}
pub fn completions(&self) -> u32 {
self.completions
}
pub fn increment_completions(&mut self, completions: u32) {
self.completions += completions;
}
pub fn touchdowns(&self) -> u32 {
self.touchdowns
}
pub fn increment_touchdowns(&mut self, touchdowns: u32) {
self.touchdowns += touchdowns;
}
pub fn interceptions(&self) -> u32 {
self.interceptions
}
pub fn increment_interceptions(&mut self, interceptions: u32) {
self.interceptions += interceptions;
}
pub fn yards(&self) -> i32 {
self.yards
}
pub fn increment_yards(&mut self, yards: i32) {
self.yards += yards;
}
}
impl std::fmt::Display for PassingStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut passing_str = format!(
"{}/{}, {} yards",
self.completions,
self.attempts,
self.yards
);
if self.touchdowns > 0 {
passing_str = format!(
"{}, {} TD",
passing_str,
self.touchdowns
);
}
if self.interceptions > 0 {
passing_str = format!(
"{}, {} INT",
passing_str,
self.interceptions
);
}
f.write_str(&passing_str)
}
}
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[cfg_attr(feature = "wasm", derive(Tsify))]
#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Default, Serialize, Deserialize)]
pub struct ReceivingStats {
targets: u32,
receptions: u32,
touchdowns: u32,
fumbles: u32,
yards: i32
}
impl ReceivingStats {
pub fn new() -> ReceivingStats {
ReceivingStats::default()
}
pub fn targets(&self) -> u32 {
self.targets
}
pub fn increment_targets(&mut self, targets: u32) {
self.targets += targets;
}
pub fn receptions(&self) -> u32 {
self.receptions
}
pub fn increment_receptions(&mut self, receptions: u32) {
self.receptions += receptions;
}
pub fn touchdowns(&self) -> u32 {
self.touchdowns
}
pub fn increment_touchdowns(&mut self, touchdowns: u32) {
self.touchdowns += touchdowns;
}
pub fn fumbles(&self) -> u32 {
self.fumbles
}
pub fn increment_fumbles(&mut self, fumbles: u32) {
self.fumbles += fumbles;
}
pub fn yards(&self) -> i32 {
self.yards
}
pub fn increment_yards(&mut self, yards: i32) {
self.yards += yards;
}
}
impl std::fmt::Display for ReceivingStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut receiving_str = format!(
"{} rec ({} tar), {} yards",
self.receptions,
self.targets,
self.yards
);
if self.touchdowns > 0 {
receiving_str = format!(
"{}, {} TD",
receiving_str,
self.touchdowns
);
}
if self.fumbles > 0 {
receiving_str = format!(
"{}, {} FUM",
receiving_str,
self.fumbles
);
}
f.write_str(&receiving_str)
}
}
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[cfg_attr(feature = "wasm", derive(Tsify))]
#[cfg_attr(feature = "wasm", tsify(into_wasm_abi, from_wasm_abi))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Default, Serialize, Deserialize)]
pub struct OffensiveStats {
passing: PassingStats,
rushing: RushingStats,
receiving: ReceivingStats
}
impl OffensiveStats {
pub fn new() -> OffensiveStats {
OffensiveStats {
passing: PassingStats::new(),
rushing: RushingStats::new(),
receiving: ReceivingStats::new()
}
}
pub fn from_properties(passing: PassingStats, rushing: RushingStats, receiving: ReceivingStats) -> OffensiveStats {
OffensiveStats {
passing,
rushing,
receiving
}
}
pub fn passing(&self) -> &PassingStats {
&self.passing
}
pub fn passing_mut(&mut self) -> &mut PassingStats {
&mut self.passing
}
pub fn increment_passing(&mut self, passing: &PassingStats) {
self.passing.increment_attempts(passing.attempts());
self.passing.increment_completions(passing.completions());
self.passing.increment_touchdowns(passing.touchdowns());
self.passing.increment_interceptions(passing.interceptions());
self.passing.increment_yards(passing.yards());
}
pub fn rushing(&self) -> &RushingStats {
&self.rushing
}
pub fn rushing_mut(&mut self) -> &mut RushingStats {
&mut self.rushing
}
pub fn increment_rushing(&mut self, rushing: &RushingStats) {
self.rushing.increment_rushes(rushing.rushes());
self.rushing.increment_fumbles(rushing.fumbles());
self.rushing.increment_touchdowns(rushing.touchdowns());
self.rushing.increment_yards(rushing.yards());
}
pub fn receiving(&self) -> &ReceivingStats {
&self.receiving
}
pub fn receiving_mut(&mut self) -> &mut ReceivingStats {
&mut self.receiving
}
pub fn increment_receiving(&mut self, receiving: &ReceivingStats) {
self.receiving.increment_targets(receiving.targets());
self.receiving.increment_receptions(receiving.receptions());
self.receiving.increment_touchdowns(receiving.touchdowns());
self.receiving.increment_fumbles(receiving.fumbles());
self.receiving.increment_yards(receiving.yards());
}
}
impl std::fmt::Display for OffensiveStats {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let stat_str = format!(
"Passing: {}\nRushing: {}\nReceiving: {}",
&self.passing,
&self.rushing,
&self.receiving
);
f.write_str(&stat_str)
}
}