Files
galaxy/crates/remote_server/src/codebase_index_proto.rs
T

120 lines
4.7 KiB
Rust

//! Conversion between remote codebase indexing domain types and proto-generated types.
use serde::Serialize;
use crate::proto;
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RemoteCodebaseIndexStatus {
pub repo_path: String,
pub state: RemoteCodebaseIndexState,
pub last_updated_epoch_millis: Option<u64>,
pub progress_completed: Option<u64>,
pub progress_total: Option<u64>,
pub failure_message: Option<String>,
pub root_hash: Option<String>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RemoteCodebaseIndexState {
NotEnabled,
Unavailable,
Disabled,
Queued,
Indexing,
Ready,
Stale,
Failed,
}
// ── Rust → Proto ────────────────────────────────────────────
impl From<&RemoteCodebaseIndexStatus> for proto::CodebaseIndexStatus {
fn from(status: &RemoteCodebaseIndexStatus) -> Self {
Self {
repo_path: status.repo_path.clone(),
state: proto_state(status.state) as i32,
last_updated_epoch_millis: status.last_updated_epoch_millis,
progress_completed: status.progress_completed,
progress_total: status.progress_total,
failure_message: status.failure_message.clone(),
root_hash: status.root_hash.clone(),
}
}
}
pub fn statuses_to_snapshot_proto<'a>(
statuses: impl IntoIterator<Item = &'a RemoteCodebaseIndexStatus>,
) -> proto::CodebaseIndexStatusesSnapshot {
proto::CodebaseIndexStatusesSnapshot {
statuses: statuses
.into_iter()
.map(proto::CodebaseIndexStatus::from)
.collect(),
}
}
fn proto_state(state: RemoteCodebaseIndexState) -> proto::CodebaseIndexStatusState {
match state {
RemoteCodebaseIndexState::NotEnabled => proto::CodebaseIndexStatusState::NotEnabled,
RemoteCodebaseIndexState::Unavailable => proto::CodebaseIndexStatusState::Unavailable,
RemoteCodebaseIndexState::Disabled => proto::CodebaseIndexStatusState::Disabled,
RemoteCodebaseIndexState::Queued => proto::CodebaseIndexStatusState::Queued,
RemoteCodebaseIndexState::Indexing => proto::CodebaseIndexStatusState::Indexing,
RemoteCodebaseIndexState::Ready => proto::CodebaseIndexStatusState::Ready,
RemoteCodebaseIndexState::Stale => proto::CodebaseIndexStatusState::Stale,
RemoteCodebaseIndexState::Failed => proto::CodebaseIndexStatusState::Failed,
}
}
// ── Proto → Rust ──────────────────────────────────────────────────
pub fn proto_to_codebase_index_status(
status: &proto::CodebaseIndexStatus,
) -> Option<RemoteCodebaseIndexStatus> {
Some(RemoteCodebaseIndexStatus {
repo_path: status.repo_path.clone(),
state: proto_to_state(proto::CodebaseIndexStatusState::try_from(status.state).ok()?)?,
last_updated_epoch_millis: status.last_updated_epoch_millis,
progress_completed: status.progress_completed,
progress_total: status.progress_total,
failure_message: status.failure_message.clone(),
root_hash: status.root_hash.clone(),
})
}
pub fn proto_to_codebase_index_statuses_snapshot(
snapshot: &proto::CodebaseIndexStatusesSnapshot,
) -> Vec<RemoteCodebaseIndexStatus> {
snapshot
.statuses
.iter()
.filter_map(proto_to_codebase_index_status)
.collect()
}
pub fn proto_to_codebase_index_status_updated(
update: &proto::CodebaseIndexStatusUpdated,
) -> Option<RemoteCodebaseIndexStatus> {
proto_to_codebase_index_status(update.status.as_ref()?)
}
fn proto_to_state(state: proto::CodebaseIndexStatusState) -> Option<RemoteCodebaseIndexState> {
match state {
proto::CodebaseIndexStatusState::NotEnabled => Some(RemoteCodebaseIndexState::NotEnabled),
proto::CodebaseIndexStatusState::Unavailable => Some(RemoteCodebaseIndexState::Unavailable),
proto::CodebaseIndexStatusState::Disabled => Some(RemoteCodebaseIndexState::Disabled),
proto::CodebaseIndexStatusState::Queued => Some(RemoteCodebaseIndexState::Queued),
proto::CodebaseIndexStatusState::Indexing => Some(RemoteCodebaseIndexState::Indexing),
proto::CodebaseIndexStatusState::Ready => Some(RemoteCodebaseIndexState::Ready),
proto::CodebaseIndexStatusState::Stale => Some(RemoteCodebaseIndexState::Stale),
proto::CodebaseIndexStatusState::Failed => Some(RemoteCodebaseIndexState::Failed),
proto::CodebaseIndexStatusState::Unspecified => None,
}
}
#[cfg(test)]
#[path = "codebase_index_proto_tests.rs"]
mod tests;