1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
use argparse::{ArgumentParser, Store};
use std::path::PathBuf;
use warp::Filter;

#[derive(Clone)]
pub struct Args {
    dir: String,
}

impl Args {
    pub fn new() -> Args {
        Args {
            dir: String::from("."),
        }
    }

    pub fn parse(&mut self) {
        let mut parser = ArgumentParser::new();
        parser.set_description("Server for yew and yew-router apps");

        parser.refer(&mut self.dir).add_option(
            &["-d", "--dir"],
            Store,
            "Directory to serve (must contain index.html)",
        );
        parser.parse_args_or_exit();
    }
}

pub async fn server(args: Args) {
    let localhost = [0, 0, 0, 0];
    let port = 8000;
    let addr = (localhost, port);

    let assets = warp::get()
        .and(warp::fs::dir(args.dir.clone()))
        .and(warp::path::end())
        .boxed();

    let files = assets.or(warp::get()
        .and(warp::fs::file(PathBuf::from(args.dir).join("index.html")))
        .boxed());

    warp::serve(warp::any().and(files).boxed()).run(addr).await;
}