betex 0.5.3

Betfair / Prediction Market Exchange
Documentation
//! Common order validation helpers.
//!
//! Provides reusable validation logic for order parameters that is shared
//! across different book implementations.

use crate::book::protocol::reject::RejectReason;
use crate::types::{Money, OddsX10000};

/// Validate order parameters common to all book types.
///
/// # Arguments
/// * `price` - The order price (odds)
/// * `stake` - The order stake amount
///
/// # Errors
/// Returns an error if:
/// - `price` is not a valid tick on the ladder
/// - `stake` is not positive
#[allow(dead_code)]
pub fn validate_order_params(price: OddsX10000, stake: Money) -> Result<(), RejectReason> {
    if !price.is_valid_tick() {
        return Err(RejectReason::InvalidOdds);
    }
    if !stake.is_positive() {
        return Err(RejectReason::InvalidStake);
    }
    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn valid_params_accepted() {
        // 2.0 odds, 100 stake
        let result = validate_order_params(OddsX10000(20000), Money(100));
        assert!(result.is_ok());
    }

    #[test]
    fn invalid_odds_rejected() {
        // 2.01 is not on the tick ladder (should be 2.02)
        let result = validate_order_params(OddsX10000(20100), Money(100));
        assert_eq!(result, Err(RejectReason::InvalidOdds));
    }

    #[test]
    fn zero_stake_rejected() {
        let result = validate_order_params(OddsX10000(20000), Money(0));
        assert_eq!(result, Err(RejectReason::InvalidStake));
    }

    #[test]
    fn negative_stake_rejected() {
        let result = validate_order_params(OddsX10000(20000), Money(-100));
        assert_eq!(result, Err(RejectReason::InvalidStake));
    }
}