diff options
Diffstat (limited to 'src/client/games/response.rs')
| -rw-r--r-- | src/client/games/response.rs | 64 |
1 files changed, 64 insertions, 0 deletions
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<usize> { | |||
| 77 | .filter_map(|value| value.trim().parse::<usize>().ok()) | 77 | .filter_map(|value| value.trim().parse::<usize>().ok()) |
| 78 | .collect() | 78 | .collect() |
| 79 | } | 79 | } |
| 80 | |||
| 81 | #[derive(Debug, Clone, PartialEq, Eq)] | ||
| 82 | pub struct RouletteResult { | ||
| 83 | pub session_id: String, | ||
| 84 | pub winnings: u64, | ||
| 85 | pub bet_amount: u64, | ||
| 86 | pub balance: i64, | ||
| 87 | pub number: u8, | ||
| 88 | pub color: String, | ||
| 89 | pub bets: String, | ||
| 90 | } | ||
| 91 | |||
| 92 | pub fn parse_roulette_response(response: &str) -> Result<RouletteResult, String> { | ||
| 93 | let response = response.trim(); | ||
| 94 | if response.is_empty() { | ||
| 95 | return Err("No response from server".to_string()); | ||
| 96 | } | ||
| 97 | if let Some(message) = response.strip_prefix("ERROR") { | ||
| 98 | let message = message.trim(); | ||
| 99 | return Err(if message.is_empty() { | ||
| 100 | "Server error".to_string() | ||
| 101 | } else { | ||
| 102 | message.to_string() | ||
| 103 | }); | ||
| 104 | } | ||
| 105 | |||
| 106 | let parts: Vec<&str> = response.split_whitespace().collect(); | ||
| 107 | if parts.first() != Some(&"ROULETTE_RESULT") || parts.len() < 8 { | ||
| 108 | return Err(format!("Unexpected server response: {response}")); | ||
| 109 | } | ||
| 110 | |||
| 111 | let winnings = parts[2] | ||
| 112 | .parse::<u64>() | ||
| 113 | .map_err(|_| format!("Invalid winnings from server: {}", parts[2]))?; | ||
| 114 | let bet_amount = parts[3] | ||
| 115 | .parse::<u64>() | ||
| 116 | .map_err(|_| format!("Invalid bet from server: {}", parts[3]))?; | ||
| 117 | let balance = parts[4] | ||
| 118 | .parse::<i64>() | ||
| 119 | .map_err(|_| format!("Invalid balance from server: {}", parts[4]))?; | ||
| 120 | let number = parts[5] | ||
| 121 | .parse::<u8>() | ||
| 122 | .map_err(|_| format!("Invalid roulette number: {}", parts[5]))?; | ||
| 123 | if number > 36 { | ||
| 124 | return Err(format!("Invalid roulette number: {number}")); | ||
| 125 | } | ||
| 126 | let color = parts[6].to_string(); | ||
| 127 | if !matches!(color.as_str(), "green" | "red" | "black") { | ||
| 128 | return Err(format!("Invalid roulette color: {color}")); | ||
| 129 | } | ||
| 130 | let bets = parts[7].to_string(); | ||
| 131 | let _: crate::roulette::Bets = serde_json::from_str(&bets) | ||
| 132 | .map_err(|error| format!("Invalid roulette bets: {error}"))?; | ||
| 133 | |||
| 134 | Ok(RouletteResult { | ||
| 135 | session_id: parts[1].to_string(), | ||
| 136 | winnings, | ||
| 137 | bet_amount, | ||
| 138 | balance, | ||
| 139 | number, | ||
| 140 | color, | ||
| 141 | bets, | ||
| 142 | }) | ||
| 143 | } | ||
