use saddle_core::{
CaptureSite, Diagnostic, DiagnosticCategory, DiagnosticCause, DiagnosticCode, DiagnosticObject,
DiagnosticObjectKind, DiagnosticStage, ErrorKind, SaddleError,
};
use saddle_observability::{DiagnosticShutdown, EmergencyDiagnostics, FileLoggingConfig};
fn source_failure(error: &std::io::Error) -> SaddleError {
let cause = DiagnosticCause::new(
DiagnosticStage::StartupConfig,
DiagnosticCode::new("config.read_failed").expect("static code"),
)
.with_object(
DiagnosticObject::new(DiagnosticObjectKind::ConfigKey, "framework.database")
.expect("schema key"),
)
.with_io(error);
SaddleError::new(
ErrorKind::Infrastructure,
"config.read_failed",
"configuration unavailable",
)
.with_diagnostic(Diagnostic::capture(
DiagnosticCategory::UnexpectedError,
CaptureSite::FirstObserved,
cause,
))
}
fn main() {
let mut output =
EmergencyDiagnostics::start(&FileLoggingConfig::default()).expect("emergency worker");
let error = source_failure(&std::io::Error::from_raw_os_error(2));
if let Some(diagnostic) = error.diagnostic() {
let _admission_only = output.handle().submit(diagnostic);
}
let deadline = std::time::Instant::now() + std::time::Duration::from_secs(1);
while output.shutdown() == DiagnosticShutdown::Pending && std::time::Instant::now() < deadline {
std::thread::sleep(std::time::Duration::from_millis(1));
}
let _status = output.snapshot();
}