omena-query-transform-runner 0.3.0

Transform-runner boundary for the Omena query facade
Documentation
use crate::plugin_api::{
    EvidenceNodeKeyV0, FactPrecision, OMENA_PLUGIN_ABI_VERSION_V0, OmenaPlugin, PluginAnalysisV0,
    PluginKindV0, PluginMetadataV0, PluginOutcomeV0, PluginTransformContextV0, PluginTransformIrV0,
    PluginWorkspaceSnapshotV0, no_change_plugin_outcome,
};

pub(super) struct SemanticObservationPluginV0;

pub(super) const SEMANTIC_OBSERVATION_PLUGIN_METADATA: PluginMetadataV0 = PluginMetadataV0 {
    plugin_id: "semantic-observation",
    kind: PluginKindV0::Transform,
    version: "0",
    abi_version: OMENA_PLUGIN_ABI_VERSION_V0,
    stability: "inTreeExperimental",
    capabilities: &["analyze", "transform"],
};

impl OmenaPlugin for SemanticObservationPluginV0 {
    fn metadata(&self) -> &'static PluginMetadataV0 {
        &SEMANTIC_OBSERVATION_PLUGIN_METADATA
    }

    fn analyze(&self, snapshot: &PluginWorkspaceSnapshotV0<'_>) -> PluginAnalysisV0 {
        let indexed_universe_count = snapshot
            .class_universe("cva-recipe-domain")
            .map_or(0, |universe| universe.entries.len());
        PluginAnalysisV0 {
            summary: format!(
                "snapshot {} exposes {indexed_universe_count} CVA class universes",
                snapshot.snapshot_id().value
            ),
            evidence_reference: EvidenceNodeKeyV0::new(
                "omena_plugin_analysis",
                SEMANTIC_OBSERVATION_PLUGIN_METADATA.plugin_id,
            ),
            precision: FactPrecision::Exact,
        }
    }

    fn transform(
        &self,
        ir: &mut PluginTransformIrV0<'_>,
        _context: PluginTransformContextV0,
    ) -> PluginOutcomeV0 {
        no_change_plugin_outcome(
            SEMANTIC_OBSERVATION_PLUGIN_METADATA.plugin_id,
            ir.nodes().len(),
            FactPrecision::Exact,
        )
    }
}

pub(super) static SEMANTIC_OBSERVATION_PLUGIN: SemanticObservationPluginV0 =
    SemanticObservationPluginV0;