Files
compliance-scanner-agent/compliance-core/src/traits/controls.rs
T
sharang ef6ee3dcd1
CI / Check (push) Has been skipped
CI / Detect Changes (push) Successful in 3s
CI / Deploy Agent (push) Failing after 5s
CI / Deploy Dashboard (push) Failing after 5s
CI / Deploy Docs (push) Has been skipped
CI / Deploy MCP (push) Failing after 4s
feat(onboarding): artifact ingest + classifier + native tramiton + suite seams (#138)
2026-07-10 16:00:51 +00:00

46 lines
1.7 KiB
Rust

//! The compliance-controls provider port.
//!
//! The mapping engine turns findings into compliance status against a corpus of
//! controls. That corpus is pluggable: the built-in OSCAL catalog by default, or
//! a tenant-owned RAG of atomic controls derived from laws
//! (`breakpilot-compliance`) when available. A [`ControlsProvider`] abstracts the
//! source so the mapping engine does not hardcode a catalog.
use crate::error::CoreError;
use crate::models::ComplianceFramework;
/// A control retrieved from a controls corpus.
#[derive(Debug, Clone)]
pub struct Control {
/// Stable control identifier (e.g. an OSCAL control id or a RAG chunk id).
pub id: String,
/// The framework this control belongs to.
pub framework: ComplianceFramework,
/// Short human-readable title.
pub title: String,
/// The control text / requirement.
pub text: String,
/// Free-form source reference (catalog name, law citation, ...).
pub source: Option<String>,
}
/// A query for relevant controls.
pub struct ControlQuery<'a> {
/// Frameworks in scope for the target.
pub frameworks: &'a [ComplianceFramework],
/// Free-text describing what to map (a finding summary, a component, ...).
pub context: &'a str,
/// Maximum number of controls to return.
pub limit: usize,
}
/// A source of compliance controls (built-in OSCAL catalog, breakpilot RAG, ...).
#[allow(async_fn_in_trait)]
pub trait ControlsProvider: Send + Sync {
/// Stable identifier for this provider.
fn name(&self) -> &str;
/// Retrieve the controls most relevant to the query.
async fn controls(&self, query: &ControlQuery<'_>) -> Result<Vec<Control>, CoreError>;
}