Skip to main content

relay_knowledge/storage/
code.rs

1//! Storage contracts for code repository indexes.
2
3use crate::domain::{
4    CodeFileFingerprint, CodeImpactRequest, CodeIndexBatch, CodeIndexCheckpoint, CodeIndexSession,
5    CodeIndexSnapshot, CodeIndexSummary, CodeRepositoryRegistration, CodeRepositoryReport,
6    CodeRepositoryStatus, CodeRepositoryTotals, CodeRetrievalHit, CodeRetrievalRequest,
7};
8
9use super::{StorageError, StorageFuture};
10
11/// Diff-derived inputs used to seed code impact expansion.
12#[derive(Debug, Clone, Default, PartialEq, Eq)]
13pub struct CodeImpactChanges {
14    pub paths: Vec<String>,
15    pub deleted_symbol_names: Vec<String>,
16}
17
18/// Persisted code repository graph and retrieval contract.
19pub trait CodeRepositoryStore: Send + Sync {
20    fn upsert_code_repository(
21        &self,
22        registration: CodeRepositoryRegistration,
23    ) -> StorageFuture<'_, CodeRepositoryStatus>;
24
25    fn code_repository_status(
26        &self,
27        repository: String,
28    ) -> StorageFuture<'_, Option<CodeRepositoryStatus>>;
29
30    fn code_repository_scope_status(
31        &self,
32        repository: String,
33        resolved_commit_sha: String,
34        path_filters: Vec<String>,
35        language_filters: Vec<String>,
36    ) -> StorageFuture<'_, Option<CodeRepositoryStatus>>;
37
38    fn code_file_fingerprints(
39        &self,
40        repository_id: String,
41    ) -> StorageFuture<'_, Vec<CodeFileFingerprint>>;
42
43    fn code_file_fingerprints_for_scope(
44        &self,
45        source_scope: String,
46    ) -> StorageFuture<'_, Vec<CodeFileFingerprint>> {
47        Box::pin(async move {
48            Err(StorageError::InvalidInput(format!(
49                "code file fingerprints for scope '{source_scope}' are unavailable"
50            )))
51        })
52    }
53
54    fn apply_code_index_snapshot(
55        &self,
56        snapshot: CodeIndexSnapshot,
57    ) -> StorageFuture<'_, CodeIndexSummary>;
58
59    fn begin_code_index_session(
60        &self,
61        session: CodeIndexSession,
62    ) -> StorageFuture<'_, CodeIndexCheckpoint> {
63        Box::pin(async move {
64            Err(StorageError::InvalidInput(format!(
65                "checkpointed code index sessions for scope '{}' are unavailable",
66                session.source_scope
67            )))
68        })
69    }
70
71    fn apply_code_index_batch(
72        &self,
73        batch: CodeIndexBatch,
74    ) -> StorageFuture<'_, CodeIndexCheckpoint> {
75        Box::pin(async move {
76            Err(StorageError::InvalidInput(format!(
77                "checkpointed code index batches for scope '{}' are unavailable",
78                batch.source_scope
79            )))
80        })
81    }
82
83    fn finalize_code_index_session(
84        &self,
85        session: CodeIndexSession,
86    ) -> StorageFuture<'_, CodeIndexSummary> {
87        Box::pin(async move {
88            Err(StorageError::InvalidInput(format!(
89                "checkpointed code index finalization for scope '{}' is unavailable",
90                session.source_scope
91            )))
92        })
93    }
94
95    fn search_code(
96        &self,
97        request: CodeRetrievalRequest,
98    ) -> StorageFuture<'_, Vec<CodeRetrievalHit>>;
99
100    fn analyze_code_impact(
101        &self,
102        request: CodeImpactRequest,
103        changes: CodeImpactChanges,
104    ) -> StorageFuture<'_, Vec<CodeRetrievalHit>>;
105
106    fn code_repository_totals(&self) -> StorageFuture<'_, CodeRepositoryTotals> {
107        Box::pin(async { Ok(CodeRepositoryTotals::default()) })
108    }
109
110    fn code_repository_report(
111        &self,
112        repository: String,
113    ) -> StorageFuture<'_, CodeRepositoryReport> {
114        Box::pin(async move {
115            Err(StorageError::InvalidInput(format!(
116                "code repository report for '{repository}' is unavailable"
117            )))
118        })
119    }
120}