use std::path::{Path, PathBuf}; use serde::Deserialize; use structopt::StructOpt; use warp::Filter; #[derive(Debug, Deserialize)] struct Config { port: u16, tls_key: PathBuf, tls_cert: PathBuf, } #[derive(Debug, StructOpt)] #[structopt(name = "ewww", about = "Web server for static sites")] struct Opt { #[structopt(parse(from_os_str))] config: PathBuf, } #[tokio::main] async fn main() { let opt = Opt::from_args(); let config = read_config(&opt.config).unwrap(); let hello = warp::any() .map(|| "hello, world\n".to_string()); eprintln!("starting server: {:?}", config); warp::serve(hello) .tls() .key_path(config.tls_key) .cert_path(config.tls_cert) .run(([127, 0, 0, 1], config.port)) .await; } fn read_config(filename: &Path) -> anyhow::Result { let config = std::fs::read_to_string(filename)?; let config: Config = serde_yaml::from_str(&config)?; Ok(config) }