use std::env;
use std::path::Path;
use std::thread;
use std::time::Duration;
use mini_docs::Builder;
use mini_static::Server;
#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let port = env::var("PORT")
.unwrap_or_else(|_| "8080".to_string())
.parse::<u16>()?;
let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR"));
let docs = manifest_dir.join("examples/fixtures/docs");
let templates = manifest_dir.join("examples/fixtures/templates");
let output = manifest_dir.join("examples/fixtures/.output");
let builder = Builder::new(docs.clone())
.templates(templates)
.output(output.clone())
.default_template("page.html")
.link_base("/")
.data_json("data.json");
builder.build()?;
thread::spawn(move || {
let mut watcher = builder
.watch()
.expect("watch() should succeed right after build()");
loop {
thread::sleep(Duration::from_millis(300));
if let Err(e) = watcher.tick() {
eprintln!("mini-docs rebuild error: {e}");
}
}
});
let server = Server::new(&output)?;
#[cfg(debug_assertions)]
let server = server.with_live_reload();
let (_port, handle) = server.run_all(port, Duration::from_secs(30)).await?;
println!("mini-docs-static example listening on 0.0.0.0:{port}");
println!("serving mini-docs output from: {}", output.display());
println!(
"edit files under {} and watch them rebuild + reload",
docs.display()
);
#[cfg(debug_assertions)]
println!("live-reload enabled at {}", mini_static::LIVE_RELOAD_PATH);
tokio::signal::ctrl_c().await?;
println!("shutting down...");
handle.shutdown().await;
Ok(())
}