buildfix-adapter-sdk 0.3.1

SDK for building intake adapters that convert sensor outputs to buildfix receipts
Documentation

SDK for building intake adapters that convert sensor outputs to buildfix receipts.

This crate provides the Adapter trait and utilities for implementing new sensor intake adapters. An adapter transforms a sensor's native output format into the standardized ReceiptEnvelope format that buildfix expects.

Creating a New Adapter

To create a new adapter, implement the Adapter trait for your sensor-specific adapter struct. The adapter is responsible for:

  1. Identifying the sensor via sensor_id() - returns a unique string like "cargo-deny" or "clippy"

  2. Loading sensor output via load() - reads and parses the sensor's output file into a ReceiptEnvelope

Example

use buildfix_adapter_sdk::{Adapter, AdapterError, ReceiptBuilder};
use buildfix_types::receipt::{ReceiptEnvelope, Severity, VerdictStatus};
use std::path::Path;

pub struct MySensorAdapter {
    sensor_id: String,
}

impl MySensorAdapter {
    pub fn new() -> Self {
        Self {
            sensor_id: "my-sensor".to_string(),
        }
    }
}

impl Adapter for MySensorAdapter {
    fn sensor_id(&self) -> &str {
        &self.sensor_id
    }

    fn load(&self, path: &Path) -> Result<ReceiptEnvelope, AdapterError> {
        // Parse your sensor's output format and convert to ReceiptEnvelope
        let output = std::fs::read_to_string(path)
            .map_err(AdapterError::Io)?;

        let parsed = serde_json::from_str::<serde_json::Value>(&output)
            .map_err(AdapterError::Json)?;

        // Convert to ReceiptEnvelope using ReceiptBuilder
        let envelope = ReceiptBuilder::new("my-sensor")
            .with_status(VerdictStatus::Fail)
            .build();

        Ok(envelope)
    }
}

Testing Adapters

Use AdapterTestHarness to validate your adapter implementation:

use buildfix_adapter_sdk::AdapterTestHarness;
use my_adapter::MySensorAdapter;

#[test]
fn test_adapter_loads_receipt() {
    let harness = AdapterTestHarness::new(MySensorAdapter::new());
    harness.validate_receipt_fixture("tests/fixtures/my-sensor/report.json")
        .expect("receipt should load correctly");
}