use clap::Parser;
use env_logger::Env;
use live_server::{Listener, Options, listen, listen_poll};
use notify::Watcher;
#[derive(Parser)]
#[clap(version)]
struct Args {
#[clap(default_value = ".")]
root: String,
#[clap(long)]
index: bool,
#[clap(short = 'H', long, default_value = "0.0.0.0")]
host: String,
#[clap(short, long, default_value = "0")]
port: u16,
#[clap(short, long, value_name = "PAGE")]
open: Option<Option<String>>,
#[clap(long, value_name = "PATH")]
browser: Option<String>,
#[clap(long)]
hard: bool,
#[clap(short = 'I', long)]
ignore: bool,
#[clap(long)]
poll: bool,
}
async fn run_listener<W: Watcher + Send + 'static>(listener: Listener<W>, args: &Args) {
if let Some(page) = &args.open {
let origin = listener.link().unwrap();
let path = page.clone().unwrap_or_default();
let url = format!("{origin}/{path}");
match &args.browser {
Some(browser) => open::with(url, browser).unwrap(),
None => open::that(url).unwrap(),
}
}
listener
.start(Options {
hard_reload: args.hard,
index_listing: args.index,
auto_ignore: args.ignore,
})
.await
.unwrap()
}
#[tokio::main]
async fn main() -> Result<(), String> {
let env = Env::new().default_filter_or("info");
env_logger::init_from_env(env);
let args = Args::parse();
let Args {
host, port, root, ..
} = &args;
let addr = format!("{host}:{port}");
if args.poll {
let listener = listen_poll(addr, root).await?;
run_listener(listener, &args).await;
} else {
let listener = listen(addr, root).await?;
run_listener(listener, &args).await;
};
Ok(())
}