| Crates.io | odds_converter |
| lib.rs | odds_converter |
| version | 0.1.0 |
| created_at | 2025-06-11 06:50:05.861949+00 |
| updated_at | 2025-06-11 06:50:05.861949+00 |
| description | A fast, accurate Rust library for converting between American, Decimal, and Fractional betting odds formats |
| homepage | https://github.com/armichaud/odds_converter |
| repository | https://github.com/armichaud/odds_converter |
| max_upload_size | |
| id | 1708242 |
| size | 121,793 |
A Rust library for converting between different betting odds formats with robust error handling and comprehensive validation.
Add this to your Cargo.toml:
[dependencies]
odds_converter = "0.1.0"
use odds_converter::Odds;
// Create odds in different formats
let american = Odds::new_american(150); // +150 American odds
let decimal = Odds::new_decimal(2.5); // 2.50 decimal odds
let fractional = Odds::new_fractional(3, 2); // 3/2 fractional odds
// Convert between formats
assert_eq!(american.to_decimal().unwrap(), 2.5);
assert_eq!(decimal.to_american().unwrap(), 150);
assert_eq!(fractional.to_decimal().unwrap(), 2.5);
// Calculate implied probability
assert_eq!(decimal.implied_probability().unwrap(), 0.4); // 40%
use odds_converter::Odds;
// Parse from strings
let odds1: Odds = "+150".parse().unwrap(); // American format
let odds2: Odds = "2.50".parse().unwrap(); // Decimal format
let odds3: Odds = "3/2".parse().unwrap(); // Fractional format
// Display as strings
println!("{}", odds1); // "+150"
println!("{}", odds2); // "2.50"
println!("{}", odds3); // "3/2"
use odds_converter::{Odds, OddsError};
// Validation catches invalid odds
let invalid = Odds::new_decimal(0.5);
match invalid.validate() {
Err(OddsError::InvalidDecimalOdds(msg)) => {
println!("Error: {}", msg); // "Decimal odds must be >= 1.0"
}
_ => {}
}
// Parsing handles malformed input
let result: Result<Odds, _> = "invalid".parse();
assert!(result.is_err());
use odds_converter::Odds;
// Convert Vegas odds to European format
let vegas_line = Odds::new_american(-110);
let european_odds = vegas_line.to_decimal().unwrap();
println!("European odds: {:.2}", european_odds); // 1.91
// Calculate probability for UK fractional odds
let uk_odds = Odds::new_fractional(9, 4);
let probability = uk_odds.implied_probability().unwrap();
println!("Implied probability: {:.1}%", probability * 100.0); // 30.8%
// Parse user input and convert
let user_input = "+200";
let odds: Odds = user_input.parse().unwrap();
let decimal_equivalent = odds.to_decimal().unwrap();
println!("{} American = {:.2} Decimal", user_input, decimal_equivalent);
The library automatically handles edge cases in American odds between -99 to +99 (excluding zero):
use odds_converter::Odds;
// Positive odds 1-99 are normalized to equivalent negative odds
let odds_pos = Odds::new_american(50); // Automatically becomes -200
assert_eq!(odds_pos.to_american().unwrap(), -200);
// Negative odds -1 to -99 are normalized to equivalent positive odds
let odds_neg = Odds::new_american(-50); // Automatically becomes +200
assert_eq!(odds_neg.to_american().unwrap(), 200);
// This ensures conversions never produce invalid odds in the problematic range
let decimal = Odds::new_decimal(1.25);
let american = decimal.to_american().unwrap(); // Returns -400, not +25
Odds - Main struct for holding odds in any formatOddsFormat - Enum representing the three odds formatsOddsError - Error types for validation and parsing failuresnew_american(value: i32) - Create American oddsnew_decimal(value: f64) - Create decimal oddsnew_fractional(num: u32, den: u32) - Create fractional oddsto_american() - Convert to American formatto_decimal() - Convert to decimal formatto_fractional() - Convert to fractional formatimplied_probability() - Calculate implied probabilityvalidate() - Validate odds valuesformat() - Get underlying formatparse() - Parse from string (via FromStr trait)to_string() - Format as string (via Display trait)The library handles floating-point precision carefully and includes comprehensive tests for mathematical correctness:
Comprehensive error types provide detailed information about failures:
InvalidAmericanOdds - Zero, -100, or out-of-range American oddsInvalidDecimalOdds - Less than 1.0, infinite, or NaN decimal oddsInvalidFractionalOdds - Invalid fractional valuesZeroDenominator - Division by zero in fractionsParseError - Malformed string inputValueOutOfRange - Unreasonably large valuesConversions are highly optimized with minimal allocations:
Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.
This project is licensed under the MIT License - see the LICENSE file for details.