1use crate::Router;
3use hyper::server::{Server, conn::AddrStream};
4use hyper::service::{make_service_fn, service_fn};
5use std::net::SocketAddr;
6use std::sync::Arc;
7
8impl Router {
9 pub async fn run(self, host: &str, port: u16) {
11 let addr: SocketAddr = format!("{}:{}", host, port)
12 .parse()
13 .expect("invalid socket address: invalid IP address syntax");
14
15 let enable_logger = self.enable_logger;
16 let router = Arc::new(self);
17
18 let make_svc = make_service_fn(move |conn: &AddrStream| {
19 let remote_addr = conn.remote_addr(); let router = router.clone();
22
23 async move {
24 Ok::<_, hyper::Error>(service_fn(move |mut req| {
25 req.extensions_mut().insert(remote_addr);
28 let router = router.clone();
29 async move { Ok::<_, hyper::Error>(router.handle_request(req).await) }
30 }))
31 }
32 });
33
34 let server = Server::bind(&addr).serve(make_svc);
35
36 if enable_logger {
37 println!("Nimble server running on http://{}", addr);
38 println!("Press Ctrl+C to stop");
39 }
40
41 if let Err(e) = server.await {
42 eprintln!("Server error: {}", e);
43 }
44 }
45}