use std::collections::BTreeMap;
use wsb::peer::model::{WorkspaceId, WorkspacePresence};
use wsb::peer::protocol::WorkspaceSummary;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SharedWorkspace {
pub id: WorkspaceId,
pub display_name: String,
pub presence: WorkspacePresence,
pub compatible: bool,
}
pub fn compare(mine: &[WorkspaceSummary], theirs: &[WorkspaceSummary]) -> Vec<SharedWorkspace> {
let theirs_by_id: BTreeMap<&WorkspaceId, &WorkspaceSummary> =
theirs.iter().map(|summary| (&summary.workspace, summary)).collect();
let mut out = Vec::new();
for summary in mine {
match theirs_by_id.get(&summary.workspace) {
Some(peer) => out.push(SharedWorkspace {
id: summary.workspace.clone(),
display_name: summary.display_name.clone(),
presence: WorkspacePresence::Shared,
compatible: peer.root_commit == summary.root_commit,
}),
None => out.push(SharedWorkspace {
id: summary.workspace.clone(),
display_name: summary.display_name.clone(),
presence: WorkspacePresence::LocalOnly,
compatible: true,
}),
}
}
let mine_ids: std::collections::BTreeSet<&WorkspaceId> =
mine.iter().map(|summary| &summary.workspace).collect();
for summary in theirs {
if !mine_ids.contains(&summary.workspace) {
out.push(SharedWorkspace {
id: summary.workspace.clone(),
display_name: summary.display_name.clone(),
presence: WorkspacePresence::PeerOnly,
compatible: true,
});
}
}
out.sort_by(|a, b| a.display_name.cmp(&b.display_name).then(a.id.cmp(&b.id)));
out
}
#[cfg(test)]
#[path = "inventory_tests.rs"]
mod tests;