summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authorJomar Milan <jomarm@jomarm.com>2026-06-09 23:31:48 -0700
committerJomar Milan <jomarm@jomarm.com>2026-06-09 23:31:48 -0700
commit13374b7928788e8cdc6c7905209bafdf943dc02e (patch)
tree217eb77e6b1e0cfcf07fb6d113db0d733c3ad0e9 /src/main.rs
parentacf5e40d02a25a6e99ef23ef61aca8cd261de9d3 (diff)
Maintain weak references to sessions for play sockets
Changes in this commit have somewhat mollified my code-smell-o-meter.
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs36
1 files changed, 25 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs
index fc0a7bb..9e7f21b 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -3,7 +3,7 @@ mod session;
mod template;
use crate::play::handle_play;
-use crate::session::{HandObject, Session};
+use crate::session::{HandObject, Seat, Session};
use crate::template::{IndexTemplate, SessionTemplate};
use askama::Template;
use axum::extract::{Path, Query, State, WebSocketUpgrade};
@@ -14,14 +14,14 @@ use axum::{Json, Router};
use rust_embed::Embed;
use std::collections::HashMap;
use std::net::SocketAddr;
-use std::sync::{Arc, RwLock};
+use std::sync::{Arc, Mutex, RwLock};
#[derive(Embed)]
#[folder = "assets/"]
struct EmbedAsset;
struct AppState {
- sessions: RwLock<HashMap<String, Session>>,
+ sessions: RwLock<HashMap<String, Arc<Mutex<Session>>>>,
}
impl AppState {
@@ -48,7 +48,7 @@ async fn main() {
axum::serve(listener, app).await.unwrap();
}
-fn serve_template(template: impl Template) -> Result<Html<String>, &'static str> {
+fn serve_template(template: &impl Template) -> Result<Html<String>, &'static str> {
template.render().map(Html).map_err(|err| {
eprintln!("Template render error: {}", err);
"Template render error"
@@ -57,7 +57,7 @@ fn serve_template(template: impl Template) -> Result<Html<String>, &'static str>
async fn serve_index() -> axum::response::Result<Html<String>> {
let template = IndexTemplate;
- Ok(serve_template(template)?)
+ Ok(serve_template(&template)?)
}
async fn serve_static(Path(path): Path<String>) -> Response {
@@ -88,10 +88,15 @@ async fn visit_session(
let sessions = state.sessions.read().unwrap();
let session = sessions
.get(&id)
- .ok_or((StatusCode::NOT_FOUND, "Session does not exist"))?;
-
- let template = SessionTemplate { id: &id, session };
- Ok(serve_template(template)?)
+ .ok_or((StatusCode::NOT_FOUND, "Session does not exist"))?
+ .lock()
+ .unwrap();
+
+ let template = SessionTemplate {
+ id: &id,
+ session: &session,
+ };
+ Ok(serve_template(&template)?)
}
async fn create_session(
@@ -104,7 +109,7 @@ async fn create_session(
let mut sessions = state.sessions.write().unwrap();
let session = Session::new(name);
- sessions.insert(id, session);
+ sessions.insert(id, Arc::new(Mutex::new(session)));
StatusCode::CREATED
}
@@ -118,7 +123,16 @@ async fn update_hands(
match sessions.get_mut(&id) {
Some(session) => {
- session.hands = payload;
+ let mut session = session.lock().unwrap();
+
+ for (color, hand) in payload {
+ let seat = session
+ .seats
+ .entry(color)
+ .or_insert_with(|| Seat { hand: Vec::new() });
+
+ seat.hand = hand;
+ }
StatusCode::NO_CONTENT
}
None => StatusCode::NOT_FOUND,