(args: &[String], cwd: &Path)
| 11 | const BENCH_NAME: &str = "perro_script_bench"; |
| 12 | |
| 13 | pub(crate) fn bench_command(args: &[String], cwd: &Path) -> Result<(), String> { |
| 14 | let project_dir = parse_flag_value(args, "--path") |
| 15 | .map(|p| resolve_local_path(&p, cwd)) |
| 16 | .or_else(|| find_project_root(cwd)) |
| 17 | .unwrap_or_else(|| cwd.to_path_buf()); |
| 18 | let project_dir = project_dir.canonicalize().unwrap_or(project_dir); |
| 19 | if !project_dir.join("project.toml").exists() { |
| 20 | return Err(format!( |
| 21 | "invalid --path `{}` for bench. Use project root (directory containing project.toml).", |
| 22 | project_dir.display() |
| 23 | )); |
| 24 | } |
| 25 | |
| 26 | let filters = parse_multi_flag(args, "--script"); |
| 27 | let methods = parse_multi_flag(args, "--method"); |
| 28 | let vars = parse_multi_flag(args, "--var"); |
| 29 | let bench_args = passthrough_args(args); |
| 30 | |
| 31 | log_step("Syncing Bench Scripts"); |
| 32 | ensure_source_overrides(&project_dir) |
| 33 | .map_err(|err| format!("failed to refresh source overrides: {err}"))?; |
| 34 | sync_scripts(&project_dir).map_err(|err| format!("failed to sync scripts: {err}"))?; |
| 35 | ensure_scripts_bench_manifest(&project_dir)?; |
| 36 | write_script_bench_harness(&project_dir, &filters, &methods, &vars)?; |
| 37 | log_done("Bench Scripts Synced"); |
| 38 | |
| 39 | log_note("Running Criterion Script Bench"); |
| 40 | let project_cfg = load_project_toml(&project_dir) |
| 41 | .map_err(|err| format!("failed to load project.toml: {err}"))?; |
| 42 | let scripts_crate = project_dir.join(".perro").join("scripts"); |
| 43 | let target_dir = project_dir.join("target"); |
| 44 | let mut cmd = Command::new("cargo"); |
| 45 | cmd.arg("bench") |
| 46 | .arg("--bench") |
| 47 | .arg(BENCH_NAME) |
| 48 | .env("CARGO_TARGET_DIR", &target_dir) |
| 49 | .current_dir(&scripts_crate); |
| 50 | if project_cfg.steam.enabled { |
| 51 | cmd.arg("--features").arg("steamworks"); |
| 52 | } |
| 53 | if bench_args.is_empty() { |
| 54 | cmd.arg("--").arg("--sample-size").arg("10"); |
| 55 | } else { |
| 56 | cmd.arg("--"); |
| 57 | cmd.args(bench_args); |
| 58 | } |
| 59 | let status = cmd.status().map_err(|err| { |
| 60 | format!( |
| 61 | "failed to run cargo bench from {}: {err}", |
| 62 | scripts_crate.display() |
| 63 | ) |
| 64 | })?; |
| 65 | if !status.success() { |
| 66 | return Err(format!( |
| 67 | "cargo bench failed with exit code {:?}", |
| 68 | status.code() |
| 69 | )); |
| 70 | } |
no test coverage detected