Skip to main content

libverify_core/
adapter.rs

1use crate::evidence::EvidenceBundle;
2
3/// Error type for platform adapter operations.
4pub type AdapterResult<T> = Result<T, Box<dyn std::error::Error + Send + Sync>>;
5
6/// Platform-agnostic evidence collection interface.
7///
8/// Implementations translate platform-specific APIs (GitHub, GitLab, Bitbucket, etc.)
9/// into the platform-neutral [`EvidenceBundle`] that controls evaluate.
10///
11/// The trait covers the "expensive" evidence collection layer only.
12/// Assessment (policy evaluation) is platform-independent and handled separately
13/// by functions like `assess_bundle` / `assess_repo_bundle`.
14pub trait PlatformAdapter: Send + Sync {
15    /// Collect evidence for a single change request (PR / MR).
16    fn collect_pr_evidence(
17        &self,
18        owner: &str,
19        repo: &str,
20        pr_number: u32,
21    ) -> AdapterResult<EvidenceBundle>;
22
23    /// Collect evidence for a batch of change requests.
24    ///
25    /// Returns `(subject_id, AdapterResult<EvidenceBundle>)` per item, preserving order.
26    /// The default implementation calls [`collect_pr_evidence`] sequentially;
27    /// platform adapters may override for batch-optimised API calls.
28    fn collect_pr_batch_evidence(
29        &self,
30        owner: &str,
31        repo: &str,
32        pr_numbers: &[u32],
33    ) -> Vec<(String, AdapterResult<EvidenceBundle>)> {
34        pr_numbers
35            .iter()
36            .map(|&n| {
37                let subject = format!("#{n}");
38                let bundle = self.collect_pr_evidence(owner, repo, n);
39                (subject, bundle)
40            })
41            .collect()
42    }
43
44    /// Collect evidence for a release (tag range).
45    fn collect_release_evidence(
46        &self,
47        owner: &str,
48        repo: &str,
49        base_tag: &str,
50        head_tag: &str,
51    ) -> AdapterResult<EvidenceBundle>;
52
53    /// Collect evidence for repository-level posture and dependencies at a given ref.
54    fn collect_repo_evidence(
55        &self,
56        owner: &str,
57        repo: &str,
58        reference: &str,
59    ) -> AdapterResult<EvidenceBundle>;
60}