cargo_build_doctor/lib.rs
1//! The library half of `cargo-build-doctor`.
2//!
3//! The CLI is the main product. This crate exists for tooling that wants the same
4//! capture, storage, and analysis pipeline without scraping terminal output.
5//!
6//! The flow is usually short. Load workspace metadata, capture a session, analyze
7//! it, then compare it against a baseline when something rebuilt and should not
8//! have.
9//!
10//! ```no_run
11//! use cargo_build_doctor::{
12//! analyze_session, capture_session, load_workspace_metadata, BuildDoctorConfig,
13//! CaptureOptions,
14//! };
15//!
16//! let workspace = load_workspace_metadata()?;
17//! let config = BuildDoctorConfig::load_or_default(&workspace.workspace_root)?;
18//! let outcome = capture_session(
19//! &workspace,
20//! &config,
21//! CaptureOptions {
22//! cargo_args: vec!["check".into(), "--workspace".into()],
23//! enable_timings: true,
24//! hash_all_inputs: false,
25//! },
26//! )?;
27//! let analysis = analyze_session(&outcome.session, &config);
28//! println!("{}", analysis.recommendations.len());
29//! # Ok::<(), anyhow::Error>(())
30//! ```
31//!
32//! Most of the values that move between those steps live in [`model`]. They stay
33//! plain on purpose because sessions get serialized, diffed later, and sometimes
34//! moved between machines.
35
36pub mod analysis;
37pub mod collect;
38pub mod config;
39pub mod driver;
40pub mod model;
41mod nightly;
42pub mod patch;
43pub mod recommend;
44pub mod store;
45
46pub use analysis::diff::{compare_sessions, CiCheckThresholds, ComparisonResult, FailOn};
47pub use analysis::rebuild_causes::{
48 explain_rebuilds, CauseCandidate, RebuildCause, RebuildExplanation,
49};
50pub use analysis::session_analysis::{analyze_session, SessionAnalysis};
51pub use collect::metadata::{load_workspace_metadata, WorkspaceMetadata};
52pub use config::BuildDoctorConfig;
53pub use driver::cargo_runner::{
54 capture_session, measure_feature, measure_linker, measure_profile, CaptureOptions,
55 CaptureOutcome, CommandSpec,
56};
57pub use model::{CapturedSession, FeatureMeasurement, Recommendation, Session};
58pub use patch::{PatchBundle, PatchPlanner};
59pub use recommend::catalog::{rule_catalog, rule_spec, RuleSpec};
60pub use recommend::engine::{RecommendationEngine, WorkspaceHealthSnapshot};
61pub use store::{ExportStore, SessionStore, SessionStorePaths};