#![doc = include_str!("../../docs/team/coach.md")]
#[cfg(feature = "rocket_okapi")]
use rocket_okapi::okapi::schemars;
#[cfg(feature = "rocket_okapi")]
use rocket_okapi::okapi::schemars::JsonSchema;
use serde::{Deserialize, Deserializer, Serialize};
#[cfg(feature = "wasm")]
use tsify_next::Tsify;
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Default, Serialize, Deserialize)]
pub struct FootballTeamCoachRaw {
risk_taking: u32,
run_pass: u32,
up_tempo: u32
}
impl FootballTeamCoachRaw {
pub fn validate(&self) -> Result<(), String> {
if self.risk_taking > 100 {
return Err(
format!(
"Risk taking attribute is out of range [0, 100]: {}",
self.risk_taking
)
)
}
if self.run_pass > 100 {
return Err(
format!(
"Run-pass attribute is out of range [0, 100]: {}",
self.run_pass
)
)
}
if self.up_tempo > 100 {
return Err(
format!(
"Up-tempo attribute is out of range [0, 100]: {}",
self.up_tempo
)
)
}
Ok(())
}
}
#[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, Serialize)]
pub struct FootballTeamCoach {
risk_taking: u32,
run_pass: u32,
up_tempo: u32
}
impl TryFrom<FootballTeamCoachRaw> for FootballTeamCoach {
type Error = String;
fn try_from(item: FootballTeamCoachRaw) -> Result<Self, Self::Error> {
match item.validate() {
Ok(()) => (),
Err(error) => return Err(error),
};
Ok(
FootballTeamCoach{
risk_taking: item.risk_taking,
run_pass: item.run_pass,
up_tempo: item.up_tempo
}
)
}
}
impl<'de> Deserialize<'de> for FootballTeamCoach {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
let raw = FootballTeamCoachRaw::deserialize(deserializer)?;
FootballTeamCoach::try_from(raw).map_err(serde::de::Error::custom)
}
}
impl Default for FootballTeamCoach {
fn default() -> Self {
FootballTeamCoach{
risk_taking: 50_u32,
run_pass: 50_u32,
up_tempo: 50_u32
}
}
}
impl FootballTeamCoach {
pub fn new() -> FootballTeamCoach {
FootballTeamCoach::default()
}
pub fn risk_taking(&self) -> u32 {
self.risk_taking
}
pub fn up_tempo(&self) -> u32 {
self.up_tempo
}
pub fn run_pass(&self) -> u32 {
self.run_pass
}
}
#[cfg_attr(feature = "rocket_okapi", derive(JsonSchema))]
#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Debug, Serialize)]
pub struct FootballTeamCoachBuilder {
risk_taking: u32,
run_pass: u32,
up_tempo: u32
}
impl Default for FootballTeamCoachBuilder {
fn default() -> Self {
FootballTeamCoachBuilder{
risk_taking: 50_u32,
run_pass: 50_u32,
up_tempo: 50_u32
}
}
}
impl FootballTeamCoachBuilder {
pub fn new() -> FootballTeamCoachBuilder {
FootballTeamCoachBuilder::default()
}
pub fn risk_taking(mut self, risk_taking: u32) -> Self {
self.risk_taking = risk_taking;
self
}
pub fn run_pass(mut self, run_pass: u32) -> Self {
self.run_pass = run_pass;
self
}
pub fn up_tempo(mut self, up_tempo: u32) -> Self {
self.up_tempo = up_tempo;
self
}
pub fn build(self) -> Result<FootballTeamCoach, String> {
let raw = FootballTeamCoachRaw{
risk_taking: self.risk_taking,
run_pass: self.run_pass,
up_tempo: self.up_tempo
};
FootballTeamCoach::try_from(raw)
}
}