librojo/web/
mod.rs

1//! Defines the Rojo web interface. This is what the Roblox Studio plugin
2//! communicates with. Eventually, we'll make this API stable, produce better
3//! documentation for it, and open it up for other consumers.
4
5mod 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}