From c20835f087c3f8c97282a5fc748944538b6d527f Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Thu, 1 Oct 2026 03:20:09 +0200 Subject: [PATCH] feat: Make tftp serve callback async --- src/tftp/server.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/tftp/server.rs b/src/tftp/server.rs index 422da99..35ec72c 100644 --- a/src/tftp/server.rs +++ b/src/tftp/server.rs @@ -28,11 +28,15 @@ pub enum Error { Timeout, } -pub async fn handle_connection( +pub async fn handle_connection( src: SocketAddr, packet: Packet, - callback: impl (Fn(&str) -> Option>) + Send + Clone + 'static, -) -> Result<(), Error> { + callback: F, +) -> Result<(), Error> +where + F: Fn(&str) -> Fut, + Fut: Future>>, +{ let socket = UdpSocket::bind("127.0.0.1:0").await?; println!( "{src}: Connecting from {}", @@ -50,7 +54,7 @@ pub async fn handle_connection( let filename = request.filename(); println!("{src}: {filename} [{:?}]", request.mode()); - let Some(data) = callback(filename) else { + let Some(data) = callback(filename).await else { Packet::error(ErrorCode::FileNotFound, "Unknown file") .send_to(&socket, &src) .await?; @@ -141,9 +145,11 @@ pub async fn handle_connection( Ok(()) } -pub async fn serve( - callback: impl (Fn(&str) -> Option>) + Send + Clone + 'static, -) -> Result<(), Error> { +pub async fn serve(callback: F) -> Result<(), Error> +where + F: Fn(&str) -> Fut + Clone + Send + 'static, + Fut: Future>> + Send + 'static, +{ let socket = UdpSocket::bind("127.0.0.1:69").await?; println!("Server started");