use crate::{Odds, OddsError, OddsFormat};
impl Odds {
pub fn validate(&self) -> Result<(), OddsError> {
match &self.format {
OddsFormat::American(value) => {
if *value == 0 {
Err(OddsError::InvalidAmericanOdds(
"American odds cannot be zero".to_string(),
))
} else if *value < -100000 || *value > 100000 {
Err(OddsError::ValueOutOfRange(format!(
"American odds out of reasonable range: {}",
value
)))
} else {
Ok(())
}
}
OddsFormat::Decimal(value) => {
if !value.is_finite() {
Err(OddsError::InfiniteOrNaN)
} else if *value < 1.0 {
Err(OddsError::InvalidDecimalOdds(format!(
"Decimal odds must be >= 1.0, got: {}",
value
)))
} else if *value > 1000.0 {
Err(OddsError::ValueOutOfRange(format!(
"Decimal odds too large: {}",
value
)))
} else {
Ok(())
}
}
OddsFormat::Fractional(num, den) => {
if *den == 0 {
Err(OddsError::ZeroDenominator)
} else if *num > 10000 || *den > 10000 {
Err(OddsError::ValueOutOfRange(
"Fractional odds values too large".to_string(),
))
} else {
Ok(())
}
}
}
}
}