summaryrefslogtreecommitdiffstats
path: root/src/client/games/response.rs
diff options
context:
space:
mode:
authorsalmonik <salmonik@tuta.io>2026-10-29 17:18:34 +0100
committersalmonik <salmonik@tuta.io>2026-10-29 17:18:34 +0100
commitd9f1fe513e6f7696809d3a9b4d44ca485fe99c97 (patch)
tree9da99200fdfe004a47056d10340b3f59c7ccc52e /src/client/games/response.rs
parentv2.0.0: reset plays audit to a generic per-game schema (diff)
downloadzagan-bet-d9f1fe513e6f7696809d3a9b4d44ca485fe99c97.tar.gz
zagan-bet-d9f1fe513e6f7696809d3a9b4d44ca485fe99c97.zip
v2.1.0: add European roulette with split bets and wheel animation
Diffstat (limited to '')
-rw-r--r--src/client/games/response.rs64
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)]
82pub 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
92pub 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}