facett-simview/examples/devserver.rs
//! The page and the mock contract on one origin, for a browser on this machine:
//!
//! ```text
//! cargo xtask build --variant facet-wrapped-sim-wasm # the bundle, in the container
//! cargo run -p facett-simview --example devserver -- [--port 8088] [--persons 110000]
//! # → http://127.0.0.1:8088/sim/
//! ```
//!
//! `/sim/` serves the facet-wrapped loader page and its emitted `bundles.json`
//! (`pkg-facet-wrapped/src/facett/assets/`), and `/sim/sim/` the `sim`
//! group's bundle (`facet-wrapped-group/dist-sim/`) — the same relative layout the
//! wheel's `assets/` has. Everything else is the mock (`facett_simview::mock`).
use std::net::TcpListener;
use std::path::PathBuf;
use std::sync::{Arc, Mutex};
use facett_simview::devserver::{DevServer, Mount};
use facett_simview::mock::MockServer;
fn main() {
let args: Vec<String> = std::env::args().collect();
let opt = |k: &str| args.windows(2).find(|w| w[0] == k).map(|w| w[1].clone());
let port: u16 = opt("--port").and_then(|p| p.parse().ok()).unwrap_or(8088);
let persons: usize = opt("--persons").and_then(|p| p.parse().ok()).unwrap_or(110_000);
let root = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("..");
let mounts = vec![
Mount { prefix: "sim/".into(), dir: root.join("facet-wrapped-group/dist-sim") },
Mount { prefix: String::new(), dir: root.join("pkg-facet-wrapped/src/facett/assets") },
];
for m in &mounts {
if !m.dir.is_dir() {
eprintln!("devserver: {} is missing — build the bundle first (cargo xtask build --variant facet-wrapped-sim-wasm)", m.dir.display());
}
}
let listener = TcpListener::bind(("127.0.0.1", port)).unwrap_or_else(|e| {
eprintln!("devserver: bind 127.0.0.1:{port}: {e}");
std::process::exit(1);
});
println!("devserver: http://127.0.0.1:{port}/sim/ ({persons} mock persons)");
DevServer { mounts, mock: Arc::new(Mutex::new(MockServer::new(persons))) }.serve(listener);
}