mod detect;
mod profiler;
pub use detect::{DetectedProfiler, detect_profiler};
pub use profiler::{ProfileError, ProfileRequest, ProfileResult, Profiler};
pub fn capture_flamegraph(request: &ProfileRequest) -> Result<Option<ProfileResult>, ProfileError> {
let profiler = detect_profiler();
match profiler {
Some(detected) => {
let result = detected.capture(request)?;
Ok(Some(result))
}
None => {
eprintln!(
"warning: --profile-on-regression requested but no profiler found.\n\
Install one of:\n\
- Linux: `perf` (linux-tools-common) + `inferno` (`cargo install inferno`)\n\
- macOS: `dtrace` (ships with Xcode) + `inferno` (`cargo install inferno`)\n\
- Any OS: `cargo install flamegraph`"
);
Ok(None)
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn capture_flamegraph_returns_none_when_no_profiler() {
let request = ProfileRequest {
command: vec!["echo".to_string(), "hello".to_string()],
output_dir: std::path::PathBuf::from("/tmp/perfgate-test-profiles"),
label: "test-bench".to_string(),
cwd: None,
env: Vec::new(),
};
let _ = capture_flamegraph(&request);
}
}