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}