use libdeno::{run, LibdenoError, LibdenoOptions};
fn main() {
libdeno::maybe_handle_child_mode();
let args: Vec<String> = std::env::args().collect();
if args.iter().any(|a| a == "--help" || a == "-h") {
println!("libdeno demo host: run a JS/TS entry (file, dir, or package.json)");
println!("usage: demo [permission flags...] <entry> [script args...]");
println!(
"permission flags: --allow-read[=paths] --allow-write[=paths] --allow-env[=names]"
);
println!(
" --allow-net[=hosts] --allow-run[=names] --allow-ffi[=paths] --allow-sys[=names]"
);
return;
}
let entry = args
.iter()
.skip(1)
.find(|a| a.as_str() != "run" && !a.starts_with('-'))
.cloned()
.unwrap_or_else(|| ".".to_string());
let permissions: Vec<String> = args
.iter()
.skip(1)
.filter(|a| a.starts_with("--allow") || *a == "-A")
.cloned()
.collect();
let script_args: Vec<String> = args
.iter()
.skip(1)
.skip_while(|a| a.as_str() == "run" || a.starts_with('-'))
.skip(1) .cloned()
.collect();
let options = LibdenoOptions {
permissions,
args: script_args,
cwd: None,
};
match run(&entry, &options) {
Ok(code) => std::process::exit(code),
Err(e) => {
print_error(&e);
std::process::exit(1);
}
}
}
fn print_error(e: &LibdenoError) {
match e {
LibdenoError::Entry(e) => eprintln!("entry error: {e}"),
LibdenoError::Permission(e) => eprintln!("permission error: {e}"),
LibdenoError::Runtime(e) => eprintln!("error: {e}"),
LibdenoError::Core(e) => eprintln!("runtime error: {e}"),
LibdenoError::Js(e) => eprintln!("script error: {e}"),
LibdenoError::Io(e) => eprintln!("io error: {e}"),
}
}