pub mod capture;
pub mod clock;
pub mod persist;
pub mod redact;
pub mod replay;
pub mod schema;
#[cfg(all(feature = "db", not(feature = "sqlite")))]
pub(crate) mod record_db;
#[cfg(all(feature = "db", not(feature = "sqlite")))]
pub(crate) mod replay_db;
#[cfg(all(feature = "db", not(feature = "sqlite")))]
pub(crate) mod wire;
#[cfg(feature = "test-support")]
pub use capture::with_capture_scope;
pub use capture::{
CaptureHandle, CaptureLayer, CaptureScope, CaptureSettings, CapturedClientIdentity, DbBuffer,
current_scope, is_valid_scope_id, scope_by_id,
};
pub use clock::{RecordingClock, ReplayClock};
pub use persist::{CapsuleRef, capsule_dir, load_capsule, persist};
#[cfg(all(feature = "test-support", feature = "db", not(feature = "sqlite")))]
pub use record_db::{build_recording_pool, maybe_capture_pool_provider};
#[cfg(all(feature = "db", not(feature = "sqlite")))]
pub use record_db::{capture_unavailable_reason, note_db_capture_unavailable};
pub use replay::{
Divergence, DivergenceKind, DivergenceLog, EXIT_DIVERGED, EXIT_REFUSED, EXIT_REPRODUCED,
ReplayOutcome, TapeProgress, Verdict, execute, print_refusal, print_verdict, refusal_exit_code,
refusal_reason,
};
#[cfg(all(feature = "db", not(feature = "sqlite")))]
pub use replay_db::{StubServer, pool_from_capsule, replica_pool_from_capsule};
#[cfg(all(feature = "db", feature = "sqlite"))]
pub const BACKEND_CAPTURE_NOTE: &str = "database capture is not available on the sqlite backend: this request's queries are absent \
from the tape";
#[cfg(all(feature = "db", feature = "sqlite"))]
pub fn note_backend_capture_gap() {
if let Some(scope) = current_scope() {
scope.note(BACKEND_CAPTURE_NOTE);
scope.mark_truncated();
}
}
pub use schema::{
AppInfo, BindValue, CAPSULE_FORMAT_VERSION, Capsule, CapsuleBody, CapsuleDb, CapsuleError,
CapsuleOutcome, CapsuleRequest, ConnectionTape, Exchange, ExchangeProtocol,
};
#[must_use]
pub fn settings_from_config(config: &crate::config::AutumnConfig) -> CaptureSettings {
CaptureSettings {
dir: config.failure_capture.dir.clone(),
max_body_bytes: config.failure_capture.max_body_bytes,
max_capsule_bytes: config.failure_capture.max_capsule_bytes,
max_capsules: config.failure_capture.max_capsules,
app_name: Some(config.telemetry.service_name.clone()),
profile: config.profile.clone(),
db_roles: Vec::new(),
}
}
#[must_use]
pub fn observed_db_roles(has_primary: bool, has_replica: bool) -> Vec<String> {
let mut roles = Vec::new();
if has_primary {
roles.push(crate::capsule::schema::TAPE_ROLE_PRIMARY.to_owned());
}
if has_replica {
roles.push(crate::capsule::schema::TAPE_ROLE_REPLICA.to_owned());
}
roles
}