Newer
Older
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
extern crate rocket;
extern crate docopt;
extern crate swerve;
use std::{path, fs, process};
use docopt::Docopt;
use rocket::response::NamedFile;
use swerve::cli;
#[get("/")]
fn serve_root(args: rocket::State<cli::Args>) -> Option<NamedFile> {
serve_files(None, args)
}
#[get("/<file..>")]
fn serve_files(file: Option<path::PathBuf>, args: rocket::State<cli::Args>) -> Option<NamedFile> {
let stub = match file {
Some(path) => path,
None => path::PathBuf::from(""),
};
let path = match args.flag_dir {
Some(ref root) => path::PathBuf::from(root).join(stub),
None => stub,
};
let meta = match fs::metadata(&path) {
Ok(metadata) => metadata,
_ => return None,
};
if meta.is_dir() && !args.flag_no_index {
NamedFile::open(path.join("index.html")).ok()
} else {
NamedFile::open(path).ok()
}
}
fn config_from_args(args: cli::Args) -> rocket::Config {
let mut builder = rocket::Config::build(rocket::config::Environment::Development);
if let Some(threads) = args.flag_threads {
builder = builder.workers(threads);
} else {
builder = builder.workers(32);
}
if let Some(port) = args.flag_port {
builder = builder.port(port);
} else {
builder = builder.port(8200);
}
if let Some(address) = args.flag_address {
builder = builder.address(address);
} else {
builder = builder.address("localhost");
}
builder.finalize().unwrap()
}
fn main() {
let args: cli::Args = Docopt::new(cli::USAGE)
.and_then(|d| d.deserialize())
.unwrap_or_else(|e| e.exit());
if args.flag_help {
println!("{}", cli::USAGE);
process::exit(0);
}
let config = config_from_args(args.clone());
let mut server = rocket::custom(config, false)
.manage(args.clone())
.mount("/", routes![serve_root, serve_files]);
if !args.flag_quiet {
server = server.attach(rocket::fairing::AdHoc::on_launch(move |rckt| {
let config = rckt.config();
println!("\nSwerve is configured with {} worker threads", config.workers);
println!("Swerving files from http://{}:{}\n", config.address, config.port);
}))
.attach(rocket::fairing::AdHoc::on_response(|req, _res| {
println!("{} {}", req.method(), req.uri());
}));
}
server.launch();
}