From d9f1fe513e6f7696809d3a9b4d44ca485fe99c97 Mon Sep 17 00:00:00 2001 From: salmonik Date: Thu, 29 Oct 2026 17:18:34 +0100 Subject: v2.1.0: add European roulette with split bets and wheel animation --- src/client/games/response.rs | 64 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) (limited to 'src/client/games/response.rs') diff --git a/src/client/games/response.rs b/src/client/games/response.rs index d7f9d45..73080dd 100644 --- a/src/client/games/response.rs +++ b/src/client/games/response.rs @@ -77,3 +77,67 @@ fn parse_indices(raw: &str) -> Vec { .filter_map(|value| value.trim().parse::().ok()) .collect() } + +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RouletteResult { + pub session_id: String, + pub winnings: u64, + pub bet_amount: u64, + pub balance: i64, + pub number: u8, + pub color: String, + pub bets: String, +} + +pub fn parse_roulette_response(response: &str) -> Result { + let response = response.trim(); + if response.is_empty() { + return Err("No response from server".to_string()); + } + if let Some(message) = response.strip_prefix("ERROR") { + let message = message.trim(); + return Err(if message.is_empty() { + "Server error".to_string() + } else { + message.to_string() + }); + } + + let parts: Vec<&str> = response.split_whitespace().collect(); + if parts.first() != Some(&"ROULETTE_RESULT") || parts.len() < 8 { + return Err(format!("Unexpected server response: {response}")); + } + + let winnings = parts[2] + .parse::() + .map_err(|_| format!("Invalid winnings from server: {}", parts[2]))?; + let bet_amount = parts[3] + .parse::() + .map_err(|_| format!("Invalid bet from server: {}", parts[3]))?; + let balance = parts[4] + .parse::() + .map_err(|_| format!("Invalid balance from server: {}", parts[4]))?; + let number = parts[5] + .parse::() + .map_err(|_| format!("Invalid roulette number: {}", parts[5]))?; + if number > 36 { + return Err(format!("Invalid roulette number: {number}")); + } + let color = parts[6].to_string(); + if !matches!(color.as_str(), "green" | "red" | "black") { + return Err(format!("Invalid roulette color: {color}")); + } + let bets = parts[7].to_string(); + let _: crate::roulette::Bets = serde_json::from_str(&bets) + .map_err(|error| format!("Invalid roulette bets: {error}"))?; + + Ok(RouletteResult { + session_id: parts[1].to_string(), + winnings, + bet_amount, + balance, + number, + color, + bets, + }) +} -- cgit v1.2.3