From d9135bf33a398dbf95d9ced0ddd660ae255ff5b7 Mon Sep 17 00:00:00 2001
From: Tim Schubert <mail@timschubert.net>
Date: Sat, 1 Jun 2019 19:58:44 +0200
Subject: [PATCH] Refactoring

---
 src/main.rs | 54 +++++++++++++++++++++++++++--------------------------
 1 file changed, 28 insertions(+), 26 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 7357ae7..7821100 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -6,39 +6,41 @@ use tokio::io::copy;
 use tokio::net::{TcpListener, TcpStream};
 use tokio::prelude::*;
 use tokio::prelude::{AsyncRead, Future};
+use tokio::executor::Spawn;
+
+fn handle_client(sock: TcpStream) -> Spawn {
+    let addr = sock.peer_addr().unwrap();
+    println!("Received connection from {:?}", addr.port());
+
+    let filename = addr.port().to_string();
+    let path = Path::new(&filename);
+
+    let (reader, writer) = sock.split();
+
+    if path.exists() {
+        let task = File::open(filename)
+            .and_then(|file| copy(file, writer))
+            .map(|res| println!("{:?}", res))
+            .map_err(|err| eprintln!("IO error: {:?}", err));
+        tokio::spawn(task)
+    } else {
+        let task = File::create(filename)
+            .and_then(|file| copy(reader, file))
+            .map(|res| println!("{:?}", res))
+            .map_err(|err| eprintln!("IO error: {:?}", err));
+        tokio::spawn(task)
+    }
+}
 
 fn main() {
     let addr = "127.0.0.1:8080".parse().unwrap();
     let listener = TcpListener::bind(&addr).expect("unable to bind TCP listener");
 
-    let server = listener
+    let task = listener
         .incoming()
         .map_err(|e| eprintln!("accept failed = {:?}", e))
-        .for_each(|sock| {
-            let addr = sock.peer_addr().unwrap();
-            println!("Received connection from {:?}", addr.port());
-
-            let filename = addr.port().to_string();
-            let path = Path::new(&filename);
-
-            let (reader, writer) = sock.split();
-
-            if path.exists() {
-                let task = File::open(filename)
-                    .and_then(|file| copy(file, writer))
-                    .map(|res| println!("{:?}", res))
-                    .map_err(|err| eprintln!("IO error: {:?}", err));
-                tokio::spawn(task)
-            } else {
-                let task = File::create(filename)
-                    .and_then(|file| copy(reader, file))
-                    .map(|res| println!("{:?}", res))
-                    .map_err(|err| eprintln!("IO error: {:?}", err));
-                tokio::spawn(task)
-            }
-
-        });
+        .for_each(|sock| handle_client(sock));
 
     // Start the Tokio runtime
-    tokio::run(server);
+    tokio::run(task);
 }