Skip to main content

diagnostic_source/
diagnostic_source.rs

1//! Source-owner example, not DB or Runtime authority generation.
2use saddle_core::{
3    CaptureSite, Diagnostic, DiagnosticCategory, DiagnosticCause, DiagnosticCode, DiagnosticObject,
4    DiagnosticObjectKind, DiagnosticStage, ErrorKind, SaddleError,
5};
6use saddle_observability::{DiagnosticShutdown, EmergencyDiagnostics, FileLoggingConfig};
7
8fn source_failure(error: &std::io::Error) -> SaddleError {
9    let cause = DiagnosticCause::new(
10        DiagnosticStage::StartupConfig,
11        DiagnosticCode::new("config.read_failed").expect("static code"),
12    )
13    .with_object(
14        DiagnosticObject::new(DiagnosticObjectKind::ConfigKey, "framework.database")
15            .expect("schema key"),
16    )
17    .with_io(error);
18    SaddleError::new(
19        ErrorKind::Infrastructure,
20        "config.read_failed",
21        "configuration unavailable",
22    )
23    .with_diagnostic(Diagnostic::capture(
24        DiagnosticCategory::UnexpectedError,
25        CaptureSite::FirstObserved,
26        cause,
27    ))
28}
29fn main() {
30    // The application must pass its already resolved logging.directory here.
31    let mut output =
32        EmergencyDiagnostics::start(&FileLoggingConfig::default()).expect("emergency worker");
33    let error = source_failure(&std::io::Error::from_raw_os_error(2));
34    if let Some(diagnostic) = error.diagnostic() {
35        let _admission_only = output.handle().submit(diagnostic);
36    }
37    // Illustrative bounded host wait; Runtime must use its EXISTING deadline.
38    let deadline = std::time::Instant::now() + std::time::Duration::from_secs(1);
39    while output.shutdown() == DiagnosticShutdown::Pending && std::time::Instant::now() < deadline {
40        std::thread::sleep(std::time::Duration::from_millis(1));
41    }
42    // Inspect written/first_failure + target; Enqueued alone never proves delivery.
43    let _status = output.snapshot();
44}