From bb0fe3bf0bf09ba6123d839a1f700ec3dfa58bf4 Mon Sep 17 00:00:00 2001 From: Nikita Vilunov Date: Sat, 4 May 2024 01:07:23 +0200 Subject: [PATCH] use borrows in http endpoint handlers --- crates/lavina-core/src/repo/mod.rs | 2 +- src/http.rs | 30 ++++++++++++++---------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/crates/lavina-core/src/repo/mod.rs b/crates/lavina-core/src/repo/mod.rs index 4c29651..0089c22 100644 --- a/crates/lavina-core/src/repo/mod.rs +++ b/crates/lavina-core/src/repo/mod.rs @@ -143,7 +143,7 @@ impl Storage { } #[tracing::instrument(skip(self), name = "Storage::create_user")] - pub async fn create_user(&mut self, name: &str) -> Result<()> { + pub async fn create_user(&self, name: &str) -> Result<()> { let query = sqlx::query( "insert into users(name) values (?);", diff --git a/src/http.rs b/src/http.rs index a879a85..dfe23a2 100644 --- a/src/http.rs +++ b/src/http.rs @@ -61,10 +61,8 @@ async fn main_loop( let core = core.clone(); let storage = storage.clone(); tokio::task::spawn(async move { - let registry = metrics.clone(); - let core = core.clone(); - let storage = storage.clone(); - let server = http1::Builder::new().serve_connection(stream, service_fn(move |r| route(registry.clone(), core.clone(), storage.clone(), r))); + let svc_fn = service_fn(|r| route(&metrics, &core, &storage, r)); + let server = http1::Builder::new().serve_connection(stream, svc_fn); if let Err(err) = server.await { tracing::error!("Error serving connection: {:?}", err); } @@ -77,16 +75,16 @@ async fn main_loop( } async fn route( - registry: MetricsRegistry, - core: LavinaCore, - storage: Storage, + registry: &MetricsRegistry, + core: &LavinaCore, + storage: &Storage, request: Request, ) -> HttpResult>> { let res = match (request.method(), request.uri().path()) { (&Method::GET, "/metrics") => endpoint_metrics(registry), - (&Method::GET, "/rooms") => endpoint_rooms(core.rooms).await, + (&Method::GET, "/rooms") => endpoint_rooms(&core.rooms).await, (&Method::POST, paths::CREATE_PLAYER) => endpoint_create_player(request, storage).await.or5xx(), - (&Method::POST, paths::STOP_PLAYER) => endpoint_stop_player(request, core.players).await.or5xx(), + (&Method::POST, paths::STOP_PLAYER) => endpoint_stop_player(request, &core.players).await.or5xx(), (&Method::POST, paths::SET_PASSWORD) => endpoint_set_password(request, core).await.or5xx(), (&Method::POST, rooms::paths::SEND_MESSAGE) => endpoint_send_room_message(request, core).await.or5xx(), (&Method::POST, rooms::paths::SET_TOPIC) => endpoint_set_room_topic(request, core).await.or5xx(), @@ -95,7 +93,7 @@ async fn route( Ok(res) } -fn endpoint_metrics(registry: MetricsRegistry) -> Response> { +fn endpoint_metrics(registry: &MetricsRegistry) -> Response> { let mf = registry.gather(); let mut buffer = vec![]; TextEncoder.encode(&mf, &mut buffer).expect("write to vec cannot fail"); @@ -103,7 +101,7 @@ fn endpoint_metrics(registry: MetricsRegistry) -> Response> { } #[tracing::instrument(skip_all)] -async fn endpoint_rooms(rooms: RoomRegistry) -> Response> { +async fn endpoint_rooms(rooms: &RoomRegistry) -> Response> { // TODO introduce management API types independent from core-domain types // TODO remove `Serialize` implementations from all core-domain types let room_list = rooms.get_all_rooms().await.to_body(); @@ -113,7 +111,7 @@ async fn endpoint_rooms(rooms: RoomRegistry) -> Response> { #[tracing::instrument(skip_all)] async fn endpoint_create_player( request: Request, - mut storage: Storage, + storage: &Storage, ) -> Result>> { let str = request.collect().await?.to_bytes(); let Ok(res) = serde_json::from_slice::(&str[..]) else { @@ -129,7 +127,7 @@ async fn endpoint_create_player( #[tracing::instrument(skip_all)] async fn endpoint_stop_player( request: Request, - players: PlayerRegistry, + players: &PlayerRegistry, ) -> Result>> { let str = request.collect().await?.to_bytes(); let Ok(res) = serde_json::from_slice::(&str[..]) else { @@ -147,7 +145,7 @@ async fn endpoint_stop_player( #[tracing::instrument(skip_all)] async fn endpoint_set_password( request: Request, - core: LavinaCore, + core: &LavinaCore, ) -> Result>> { let str = request.collect().await?.to_bytes(); let Ok(res) = serde_json::from_slice::(&str[..]) else { @@ -165,7 +163,7 @@ async fn endpoint_set_password( async fn endpoint_send_room_message( request: Request, - core: LavinaCore, + core: &LavinaCore, ) -> Result>> { let str = request.collect().await?.to_bytes(); let Ok(req) = serde_json::from_slice::(&str[..]) else { @@ -187,7 +185,7 @@ async fn endpoint_send_room_message( async fn endpoint_set_room_topic( request: Request, - core: LavinaCore, + core: &LavinaCore, ) -> Result>> { let str = request.collect().await?.to_bytes(); let Ok(req) = serde_json::from_slice::(&str[..]) else {