1mod api;
6mod assets;
7pub mod interface;
8mod ui;
9mod util;
10
11use std::convert::Infallible;
12use std::net::SocketAddr;
13use std::sync::Arc;
14
15use hyper::{
16 server::Server,
17 service::{make_service_fn, service_fn},
18 Body, Request,
19};
20use tokio::runtime::Runtime;
21
22use crate::serve_session::ServeSession;
23
24pub struct LiveServer {
25 serve_session: Arc<ServeSession>,
26}
27
28impl LiveServer {
29 pub fn new(serve_session: Arc<ServeSession>) -> Self {
30 LiveServer { serve_session }
31 }
32
33 pub fn start(self, address: SocketAddr) {
34 let serve_session = Arc::clone(&self.serve_session);
35
36 let make_service = make_service_fn(move |_conn| {
37 let serve_session = Arc::clone(&serve_session);
38
39 async {
40 let service = move |req: Request<Body>| {
41 let serve_session = Arc::clone(&serve_session);
42
43 async move {
44 if req.uri().path().starts_with("/api") {
45 Ok::<_, Infallible>(api::call(serve_session, req).await)
46 } else {
47 Ok::<_, Infallible>(ui::call(serve_session, req).await)
48 }
49 }
50 };
51
52 Ok::<_, Infallible>(service_fn(service))
53 }
54 });
55
56 let rt = Runtime::new().unwrap();
57 let _guard = rt.enter();
58 let server = Server::bind(&address).serve(make_service);
59 rt.block_on(server).unwrap();
60 }
61}