mod base;
#[cfg(feature = "draft-2026-07-28")]
mod draft;
mod inventory;
mod lifecycle;
mod negotiation;
mod prompts;
mod resources;
mod support;
mod tools;
mod transport;
mod utilities;
use crate::context::TraceContext;
use crate::report::Finding;
type CheckFn = fn(&TraceContext<'_>, &mut FindingSink);
#[derive(Debug, Clone, Copy)]
pub struct Check {
pub id: &'static str,
run: CheckFn,
}
#[derive(Debug, Default)]
#[non_exhaustive]
pub struct CheckOutcome {
pub findings: Vec<Finding>,
pub subjects: u32,
}
impl Check {
#[must_use]
pub fn run(&self, context: &TraceContext<'_>) -> CheckOutcome {
let mut sink = FindingSink {
check: self.id,
findings: Vec::new(),
subjects: 0,
};
(self.run)(context, &mut sink);
CheckOutcome {
findings: sink.findings,
subjects: sink.subjects,
}
}
}
#[derive(Debug)]
pub struct FindingSink {
check: &'static str,
findings: Vec<Finding>,
subjects: u32,
}
impl FindingSink {
pub fn push(&mut self, seq: Option<u64>, detail: String) {
self.findings.push(Finding {
check: self.check.to_owned(),
seq,
detail,
});
}
pub const fn examined(&mut self) {
self.subjects = self.subjects.saturating_add(1);
}
}
pub use inventory::{ALL, find};