1#![allow(non_snake_case)]
2
3pub mod error;
4mod macros;
5mod typed_envelope;
6
7pub use error::*;
8pub use typed_envelope::*;
9
10use collections::HashMap;
11pub use prost::{DecodeError, Message};
12use serde::Serialize;
13use std::{
14 any::{Any, TypeId},
15 cmp,
16 fmt::{self, Debug},
17 iter, mem,
18 time::{Duration, SystemTime, UNIX_EPOCH},
19};
20
21include!(concat!(env!("OUT_DIR"), "/zed.messages.rs"));
22
23pub const SSH_PEER_ID: PeerId = PeerId { owner_id: 0, id: 0 };
24pub const SSH_PROJECT_ID: u64 = 0;
25
26pub trait EnvelopedMessage: Clone + Debug + Serialize + Sized + Send + Sync + 'static {
27 const NAME: &'static str;
28 const PRIORITY: MessagePriority;
29 fn into_envelope(
30 self,
31 id: u32,
32 responding_to: Option<u32>,
33 original_sender_id: Option<PeerId>,
34 ) -> Envelope;
35 fn from_envelope(envelope: Envelope) -> Option<Self>;
36}
37
38pub trait EntityMessage: EnvelopedMessage {
39 type Entity;
40 fn remote_entity_id(&self) -> u64;
41}
42
43pub trait RequestMessage: EnvelopedMessage {
44 type Response: EnvelopedMessage;
45}
46
47pub trait AnyTypedEnvelope: 'static + Send + Sync {
48 fn payload_type_id(&self) -> TypeId;
49 fn payload_type_name(&self) -> &'static str;
50 fn as_any(&self) -> &dyn Any;
51 fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync>;
52 fn is_background(&self) -> bool;
53 fn original_sender_id(&self) -> Option<PeerId>;
54 fn sender_id(&self) -> PeerId;
55 fn message_id(&self) -> u32;
56}
57
58pub enum MessagePriority {
59 Foreground,
60 Background,
61}
62
63impl<T: EnvelopedMessage> AnyTypedEnvelope for TypedEnvelope<T> {
64 fn payload_type_id(&self) -> TypeId {
65 TypeId::of::<T>()
66 }
67
68 fn payload_type_name(&self) -> &'static str {
69 T::NAME
70 }
71
72 fn as_any(&self) -> &dyn Any {
73 self
74 }
75
76 fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync> {
77 self
78 }
79
80 fn is_background(&self) -> bool {
81 matches!(T::PRIORITY, MessagePriority::Background)
82 }
83
84 fn original_sender_id(&self) -> Option<PeerId> {
85 self.original_sender_id
86 }
87
88 fn sender_id(&self) -> PeerId {
89 self.sender_id
90 }
91
92 fn message_id(&self) -> u32 {
93 self.message_id
94 }
95}
96
97impl PeerId {
98 pub fn from_u64(peer_id: u64) -> Self {
99 let owner_id = (peer_id >> 32) as u32;
100 let id = peer_id as u32;
101 Self { owner_id, id }
102 }
103
104 pub fn as_u64(self) -> u64 {
105 ((self.owner_id as u64) << 32) | (self.id as u64)
106 }
107}
108
109impl Copy for PeerId {}
110
111impl Eq for PeerId {}
112
113impl Ord for PeerId {
114 fn cmp(&self, other: &Self) -> cmp::Ordering {
115 self.owner_id
116 .cmp(&other.owner_id)
117 .then_with(|| self.id.cmp(&other.id))
118 }
119}
120
121impl PartialOrd for PeerId {
122 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
123 Some(self.cmp(other))
124 }
125}
126
127impl std::hash::Hash for PeerId {
128 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
129 self.owner_id.hash(state);
130 self.id.hash(state);
131 }
132}
133
134impl fmt::Display for PeerId {
135 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
136 write!(f, "{}/{}", self.owner_id, self.id)
137 }
138}
139
140messages!(
141 (AcceptTermsOfService, Foreground),
142 (AcceptTermsOfServiceResponse, Foreground),
143 (Ack, Foreground),
144 (AckBufferOperation, Background),
145 (AckChannelMessage, Background),
146 (AddNotification, Foreground),
147 (AddProjectCollaborator, Foreground),
148 (ApplyCodeAction, Background),
149 (ApplyCodeActionResponse, Background),
150 (ApplyCompletionAdditionalEdits, Background),
151 (ApplyCompletionAdditionalEditsResponse, Background),
152 (BufferReloaded, Foreground),
153 (BufferSaved, Foreground),
154 (Call, Foreground),
155 (CallCanceled, Foreground),
156 (CancelCall, Foreground),
157 (ChannelMessageSent, Foreground),
158 (ChannelMessageUpdate, Foreground),
159 (ComputeEmbeddings, Background),
160 (ComputeEmbeddingsResponse, Background),
161 (CopyProjectEntry, Foreground),
162 (CreateBufferForPeer, Foreground),
163 (CreateChannel, Foreground),
164 (CreateChannelResponse, Foreground),
165 (CreateProjectEntry, Foreground),
166 (CreateRoom, Foreground),
167 (CreateRoomResponse, Foreground),
168 (DeclineCall, Foreground),
169 (DeleteChannel, Foreground),
170 (DeleteNotification, Foreground),
171 (UpdateNotification, Foreground),
172 (DeleteProjectEntry, Foreground),
173 (EndStream, Foreground),
174 (Error, Foreground),
175 (ExpandProjectEntry, Foreground),
176 (ExpandProjectEntryResponse, Foreground),
177 (Follow, Foreground),
178 (FollowResponse, Foreground),
179 (FormatBuffers, Foreground),
180 (FormatBuffersResponse, Foreground),
181 (FuzzySearchUsers, Foreground),
182 (GetCachedEmbeddings, Background),
183 (GetCachedEmbeddingsResponse, Background),
184 (GetChannelMembers, Foreground),
185 (GetChannelMembersResponse, Foreground),
186 (GetChannelMessages, Background),
187 (GetChannelMessagesById, Background),
188 (GetChannelMessagesResponse, Background),
189 (GetCodeActions, Background),
190 (GetCodeActionsResponse, Background),
191 (GetCompletions, Background),
192 (GetCompletionsResponse, Background),
193 (GetDefinition, Background),
194 (GetDefinitionResponse, Background),
195 (GetDeclaration, Background),
196 (GetDeclarationResponse, Background),
197 (GetDocumentHighlights, Background),
198 (GetDocumentHighlightsResponse, Background),
199 (GetHover, Background),
200 (GetHoverResponse, Background),
201 (GetNotifications, Foreground),
202 (GetNotificationsResponse, Foreground),
203 (GetPrivateUserInfo, Foreground),
204 (GetPrivateUserInfoResponse, Foreground),
205 (GetProjectSymbols, Background),
206 (GetProjectSymbolsResponse, Background),
207 (GetReferences, Background),
208 (GetReferencesResponse, Background),
209 (GetSignatureHelp, Background),
210 (GetSignatureHelpResponse, Background),
211 (GetSupermavenApiKey, Background),
212 (GetSupermavenApiKeyResponse, Background),
213 (GetTypeDefinition, Background),
214 (GetTypeDefinitionResponse, Background),
215 (GetImplementation, Background),
216 (GetImplementationResponse, Background),
217 (GetLlmToken, Background),
218 (GetLlmTokenResponse, Background),
219 (GetUsers, Foreground),
220 (Hello, Foreground),
221 (IncomingCall, Foreground),
222 (InlayHints, Background),
223 (InlayHintsResponse, Background),
224 (InviteChannelMember, Foreground),
225 (JoinChannel, Foreground),
226 (JoinChannelBuffer, Foreground),
227 (JoinChannelBufferResponse, Foreground),
228 (JoinChannelChat, Foreground),
229 (JoinChannelChatResponse, Foreground),
230 (JoinProject, Foreground),
231 (JoinHostedProject, Foreground),
232 (JoinProjectResponse, Foreground),
233 (JoinRoom, Foreground),
234 (JoinRoomResponse, Foreground),
235 (LeaveChannelBuffer, Background),
236 (LeaveChannelChat, Foreground),
237 (LeaveProject, Foreground),
238 (LeaveRoom, Foreground),
239 (MarkNotificationRead, Foreground),
240 (MoveChannel, Foreground),
241 (OnTypeFormatting, Background),
242 (OnTypeFormattingResponse, Background),
243 (OpenBufferById, Background),
244 (OpenBufferByPath, Background),
245 (OpenBufferForSymbol, Background),
246 (OpenBufferForSymbolResponse, Background),
247 (OpenBufferResponse, Background),
248 (PerformRename, Background),
249 (PerformRenameResponse, Background),
250 (Ping, Foreground),
251 (PrepareRename, Background),
252 (PrepareRenameResponse, Background),
253 (ProjectEntryResponse, Foreground),
254 (CountLanguageModelTokens, Background),
255 (CountLanguageModelTokensResponse, Background),
256 (RefreshLlmToken, Background),
257 (RefreshInlayHints, Foreground),
258 (RejoinChannelBuffers, Foreground),
259 (RejoinChannelBuffersResponse, Foreground),
260 (RejoinRoom, Foreground),
261 (RejoinRoomResponse, Foreground),
262 (ReloadBuffers, Foreground),
263 (ReloadBuffersResponse, Foreground),
264 (RemoveChannelMember, Foreground),
265 (RemoveChannelMessage, Foreground),
266 (UpdateChannelMessage, Foreground),
267 (RemoveContact, Foreground),
268 (RemoveProjectCollaborator, Foreground),
269 (RenameChannel, Foreground),
270 (RenameChannelResponse, Foreground),
271 (RenameProjectEntry, Foreground),
272 (RequestContact, Foreground),
273 (ResolveCompletionDocumentation, Background),
274 (ResolveCompletionDocumentationResponse, Background),
275 (ResolveInlayHint, Background),
276 (ResolveInlayHintResponse, Background),
277 (RespondToChannelInvite, Foreground),
278 (RespondToContactRequest, Foreground),
279 (RoomUpdated, Foreground),
280 (SaveBuffer, Foreground),
281 (SetChannelMemberRole, Foreground),
282 (SetChannelVisibility, Foreground),
283 (SendChannelMessage, Background),
284 (SendChannelMessageResponse, Background),
285 (ShareProject, Foreground),
286 (ShareProjectResponse, Foreground),
287 (ShowContacts, Foreground),
288 (StartLanguageServer, Foreground),
289 (SubscribeToChannels, Foreground),
290 (SynchronizeBuffers, Foreground),
291 (SynchronizeBuffersResponse, Foreground),
292 (TaskContextForLocation, Background),
293 (TaskContext, Background),
294 (Test, Foreground),
295 (Unfollow, Foreground),
296 (UnshareProject, Foreground),
297 (UpdateBuffer, Foreground),
298 (UpdateBufferFile, Foreground),
299 (UpdateChannelBuffer, Foreground),
300 (UpdateChannelBufferCollaborators, Foreground),
301 (UpdateChannels, Foreground),
302 (UpdateUserChannels, Foreground),
303 (UpdateContacts, Foreground),
304 (UpdateDiagnosticSummary, Foreground),
305 (UpdateDiffBase, Foreground),
306 (UpdateFollowers, Foreground),
307 (UpdateInviteInfo, Foreground),
308 (UpdateLanguageServer, Foreground),
309 (UpdateParticipantLocation, Foreground),
310 (UpdateProject, Foreground),
311 (UpdateProjectCollaborator, Foreground),
312 (UpdateUserPlan, Foreground),
313 (UpdateWorktree, Foreground),
314 (UpdateWorktreeSettings, Foreground),
315 (UsersResponse, Foreground),
316 (LspExtExpandMacro, Background),
317 (LspExtExpandMacroResponse, Background),
318 (SetRoomParticipantRole, Foreground),
319 (BlameBuffer, Foreground),
320 (BlameBufferResponse, Foreground),
321 (CreateDevServerProject, Background),
322 (CreateDevServerProjectResponse, Foreground),
323 (CreateDevServer, Foreground),
324 (CreateDevServerResponse, Foreground),
325 (DevServerInstructions, Foreground),
326 (ShutdownDevServer, Foreground),
327 (ReconnectDevServer, Foreground),
328 (ReconnectDevServerResponse, Foreground),
329 (ShareDevServerProject, Foreground),
330 (JoinDevServerProject, Foreground),
331 (RejoinRemoteProjects, Foreground),
332 (RejoinRemoteProjectsResponse, Foreground),
333 (MultiLspQuery, Background),
334 (MultiLspQueryResponse, Background),
335 (DevServerProjectsUpdate, Foreground),
336 (ValidateDevServerProjectRequest, Background),
337 (ListRemoteDirectory, Background),
338 (ListRemoteDirectoryResponse, Background),
339 (UpdateDevServerProject, Background),
340 (DeleteDevServer, Foreground),
341 (DeleteDevServerProject, Foreground),
342 (RegenerateDevServerToken, Foreground),
343 (RegenerateDevServerTokenResponse, Foreground),
344 (RenameDevServer, Foreground),
345 (OpenNewBuffer, Foreground),
346 (RestartLanguageServers, Foreground),
347 (LinkedEditingRange, Background),
348 (LinkedEditingRangeResponse, Background),
349 (AdvertiseContexts, Foreground),
350 (OpenContext, Foreground),
351 (OpenContextResponse, Foreground),
352 (CreateContext, Foreground),
353 (CreateContextResponse, Foreground),
354 (UpdateContext, Foreground),
355 (SynchronizeContexts, Foreground),
356 (SynchronizeContextsResponse, Foreground),
357 (LspExtSwitchSourceHeader, Background),
358 (LspExtSwitchSourceHeaderResponse, Background),
359 (AddWorktree, Foreground),
360 (AddWorktreeResponse, Foreground),
361 (FindSearchCandidates, Background),
362 (FindSearchCandidatesResponse, Background),
363 (CloseBuffer, Foreground),
364 (UpdateUserSettings, Foreground),
365 (CheckFileExists, Background),
366 (CheckFileExistsResponse, Background),
367 (ShutdownRemoteServer, Foreground),
368 (RemoveWorktree, Foreground),
369);
370
371request_messages!(
372 (AcceptTermsOfService, AcceptTermsOfServiceResponse),
373 (ApplyCodeAction, ApplyCodeActionResponse),
374 (
375 ApplyCompletionAdditionalEdits,
376 ApplyCompletionAdditionalEditsResponse
377 ),
378 (Call, Ack),
379 (CancelCall, Ack),
380 (CopyProjectEntry, ProjectEntryResponse),
381 (ComputeEmbeddings, ComputeEmbeddingsResponse),
382 (CreateChannel, CreateChannelResponse),
383 (CreateProjectEntry, ProjectEntryResponse),
384 (CreateRoom, CreateRoomResponse),
385 (DeclineCall, Ack),
386 (DeleteChannel, Ack),
387 (DeleteProjectEntry, ProjectEntryResponse),
388 (ExpandProjectEntry, ExpandProjectEntryResponse),
389 (Follow, FollowResponse),
390 (FormatBuffers, FormatBuffersResponse),
391 (FuzzySearchUsers, UsersResponse),
392 (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
393 (GetChannelMembers, GetChannelMembersResponse),
394 (GetChannelMessages, GetChannelMessagesResponse),
395 (GetChannelMessagesById, GetChannelMessagesResponse),
396 (GetCodeActions, GetCodeActionsResponse),
397 (GetCompletions, GetCompletionsResponse),
398 (GetDefinition, GetDefinitionResponse),
399 (GetDeclaration, GetDeclarationResponse),
400 (GetImplementation, GetImplementationResponse),
401 (GetDocumentHighlights, GetDocumentHighlightsResponse),
402 (GetHover, GetHoverResponse),
403 (GetLlmToken, GetLlmTokenResponse),
404 (GetNotifications, GetNotificationsResponse),
405 (GetPrivateUserInfo, GetPrivateUserInfoResponse),
406 (GetProjectSymbols, GetProjectSymbolsResponse),
407 (GetReferences, GetReferencesResponse),
408 (GetSignatureHelp, GetSignatureHelpResponse),
409 (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
410 (GetTypeDefinition, GetTypeDefinitionResponse),
411 (LinkedEditingRange, LinkedEditingRangeResponse),
412 (ListRemoteDirectory, ListRemoteDirectoryResponse),
413 (UpdateDevServerProject, Ack),
414 (GetUsers, UsersResponse),
415 (IncomingCall, Ack),
416 (InlayHints, InlayHintsResponse),
417 (InviteChannelMember, Ack),
418 (JoinChannel, JoinRoomResponse),
419 (JoinChannelBuffer, JoinChannelBufferResponse),
420 (JoinChannelChat, JoinChannelChatResponse),
421 (JoinHostedProject, JoinProjectResponse),
422 (JoinProject, JoinProjectResponse),
423 (JoinRoom, JoinRoomResponse),
424 (LeaveChannelBuffer, Ack),
425 (LeaveRoom, Ack),
426 (MarkNotificationRead, Ack),
427 (MoveChannel, Ack),
428 (OnTypeFormatting, OnTypeFormattingResponse),
429 (OpenBufferById, OpenBufferResponse),
430 (OpenBufferByPath, OpenBufferResponse),
431 (OpenBufferForSymbol, OpenBufferForSymbolResponse),
432 (OpenNewBuffer, OpenBufferResponse),
433 (PerformRename, PerformRenameResponse),
434 (Ping, Ack),
435 (PrepareRename, PrepareRenameResponse),
436 (CountLanguageModelTokens, CountLanguageModelTokensResponse),
437 (RefreshInlayHints, Ack),
438 (RejoinChannelBuffers, RejoinChannelBuffersResponse),
439 (RejoinRoom, RejoinRoomResponse),
440 (ReloadBuffers, ReloadBuffersResponse),
441 (RemoveChannelMember, Ack),
442 (RemoveChannelMessage, Ack),
443 (UpdateChannelMessage, Ack),
444 (RemoveContact, Ack),
445 (RenameChannel, RenameChannelResponse),
446 (RenameProjectEntry, ProjectEntryResponse),
447 (RequestContact, Ack),
448 (
449 ResolveCompletionDocumentation,
450 ResolveCompletionDocumentationResponse
451 ),
452 (ResolveInlayHint, ResolveInlayHintResponse),
453 (RespondToChannelInvite, Ack),
454 (RespondToContactRequest, Ack),
455 (SaveBuffer, BufferSaved),
456 (FindSearchCandidates, FindSearchCandidatesResponse),
457 (SendChannelMessage, SendChannelMessageResponse),
458 (SetChannelMemberRole, Ack),
459 (SetChannelVisibility, Ack),
460 (ShareProject, ShareProjectResponse),
461 (SynchronizeBuffers, SynchronizeBuffersResponse),
462 (TaskContextForLocation, TaskContext),
463 (Test, Test),
464 (UpdateBuffer, Ack),
465 (UpdateParticipantLocation, Ack),
466 (UpdateProject, Ack),
467 (UpdateWorktree, Ack),
468 (LspExtExpandMacro, LspExtExpandMacroResponse),
469 (SetRoomParticipantRole, Ack),
470 (BlameBuffer, BlameBufferResponse),
471 (CreateDevServerProject, CreateDevServerProjectResponse),
472 (CreateDevServer, CreateDevServerResponse),
473 (ShutdownDevServer, Ack),
474 (ShareDevServerProject, ShareProjectResponse),
475 (JoinDevServerProject, JoinProjectResponse),
476 (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
477 (ReconnectDevServer, ReconnectDevServerResponse),
478 (ValidateDevServerProjectRequest, Ack),
479 (MultiLspQuery, MultiLspQueryResponse),
480 (DeleteDevServer, Ack),
481 (DeleteDevServerProject, Ack),
482 (RegenerateDevServerToken, RegenerateDevServerTokenResponse),
483 (RenameDevServer, Ack),
484 (RestartLanguageServers, Ack),
485 (OpenContext, OpenContextResponse),
486 (CreateContext, CreateContextResponse),
487 (SynchronizeContexts, SynchronizeContextsResponse),
488 (LspExtSwitchSourceHeader, LspExtSwitchSourceHeaderResponse),
489 (AddWorktree, AddWorktreeResponse),
490 (CheckFileExists, CheckFileExistsResponse),
491 (ShutdownRemoteServer, Ack),
492 (RemoveWorktree, Ack)
493);
494
495entity_messages!(
496 {project_id, ShareProject},
497 AddProjectCollaborator,
498 AddWorktree,
499 ApplyCodeAction,
500 ApplyCompletionAdditionalEdits,
501 BlameBuffer,
502 BufferReloaded,
503 BufferSaved,
504 CloseBuffer,
505 CopyProjectEntry,
506 CreateBufferForPeer,
507 CreateProjectEntry,
508 DeleteProjectEntry,
509 ExpandProjectEntry,
510 FindSearchCandidates,
511 FormatBuffers,
512 GetCodeActions,
513 GetCompletions,
514 GetDefinition,
515 GetDeclaration,
516 GetImplementation,
517 GetDocumentHighlights,
518 GetHover,
519 GetProjectSymbols,
520 GetReferences,
521 GetSignatureHelp,
522 GetTypeDefinition,
523 InlayHints,
524 JoinProject,
525 LeaveProject,
526 LinkedEditingRange,
527 MultiLspQuery,
528 RestartLanguageServers,
529 OnTypeFormatting,
530 OpenNewBuffer,
531 OpenBufferById,
532 OpenBufferByPath,
533 OpenBufferForSymbol,
534 PerformRename,
535 PrepareRename,
536 RefreshInlayHints,
537 ReloadBuffers,
538 RemoveProjectCollaborator,
539 RenameProjectEntry,
540 ResolveCompletionDocumentation,
541 ResolveInlayHint,
542 SaveBuffer,
543 StartLanguageServer,
544 SynchronizeBuffers,
545 TaskContextForLocation,
546 UnshareProject,
547 UpdateBuffer,
548 UpdateBufferFile,
549 UpdateDiagnosticSummary,
550 UpdateDiffBase,
551 UpdateLanguageServer,
552 UpdateProject,
553 UpdateProjectCollaborator,
554 UpdateWorktree,
555 UpdateWorktreeSettings,
556 LspExtExpandMacro,
557 AdvertiseContexts,
558 OpenContext,
559 CreateContext,
560 UpdateContext,
561 SynchronizeContexts,
562 LspExtSwitchSourceHeader,
563 UpdateUserSettings,
564 CheckFileExists,
565);
566
567entity_messages!(
568 {channel_id, Channel},
569 ChannelMessageSent,
570 ChannelMessageUpdate,
571 RemoveChannelMessage,
572 UpdateChannelMessage,
573 UpdateChannelBuffer,
574 UpdateChannelBufferCollaborators,
575);
576
577impl From<Timestamp> for SystemTime {
578 fn from(val: Timestamp) -> Self {
579 UNIX_EPOCH
580 .checked_add(Duration::new(val.seconds, val.nanos))
581 .unwrap()
582 }
583}
584
585impl From<SystemTime> for Timestamp {
586 fn from(time: SystemTime) -> Self {
587 let duration = time.duration_since(UNIX_EPOCH).unwrap();
588 Self {
589 seconds: duration.as_secs(),
590 nanos: duration.subsec_nanos(),
591 }
592 }
593}
594
595impl From<u128> for Nonce {
596 fn from(nonce: u128) -> Self {
597 let upper_half = (nonce >> 64) as u64;
598 let lower_half = nonce as u64;
599 Self {
600 upper_half,
601 lower_half,
602 }
603 }
604}
605
606impl From<Nonce> for u128 {
607 fn from(nonce: Nonce) -> Self {
608 let upper_half = (nonce.upper_half as u128) << 64;
609 let lower_half = nonce.lower_half as u128;
610 upper_half | lower_half
611 }
612}
613
614pub fn split_worktree_update(
615 mut message: UpdateWorktree,
616 max_chunk_size: usize,
617) -> impl Iterator<Item = UpdateWorktree> {
618 let mut done_files = false;
619
620 let mut repository_map = message
621 .updated_repositories
622 .into_iter()
623 .map(|repo| (repo.work_directory_id, repo))
624 .collect::<HashMap<_, _>>();
625
626 iter::from_fn(move || {
627 if done_files {
628 return None;
629 }
630
631 let updated_entries_chunk_size = cmp::min(message.updated_entries.len(), max_chunk_size);
632 let updated_entries: Vec<_> = message
633 .updated_entries
634 .drain(..updated_entries_chunk_size)
635 .collect();
636
637 let removed_entries_chunk_size = cmp::min(message.removed_entries.len(), max_chunk_size);
638 let removed_entries = message
639 .removed_entries
640 .drain(..removed_entries_chunk_size)
641 .collect();
642
643 done_files = message.updated_entries.is_empty() && message.removed_entries.is_empty();
644
645 let mut updated_repositories = Vec::new();
646
647 if !repository_map.is_empty() {
648 for entry in &updated_entries {
649 if let Some(repo) = repository_map.remove(&entry.id) {
650 updated_repositories.push(repo)
651 }
652 }
653 }
654
655 let removed_repositories = if done_files {
656 mem::take(&mut message.removed_repositories)
657 } else {
658 Default::default()
659 };
660
661 if done_files {
662 updated_repositories.extend(mem::take(&mut repository_map).into_values());
663 }
664
665 Some(UpdateWorktree {
666 project_id: message.project_id,
667 worktree_id: message.worktree_id,
668 root_name: message.root_name.clone(),
669 abs_path: message.abs_path.clone(),
670 updated_entries,
671 removed_entries,
672 scan_id: message.scan_id,
673 is_last_update: done_files && message.is_last_update,
674 updated_repositories,
675 removed_repositories,
676 })
677 })
678}
679
680#[cfg(test)]
681mod tests {
682 use super::*;
683
684 #[test]
685 fn test_converting_peer_id_from_and_to_u64() {
686 let peer_id = PeerId {
687 owner_id: 10,
688 id: 3,
689 };
690 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
691 let peer_id = PeerId {
692 owner_id: u32::MAX,
693 id: 3,
694 };
695 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
696 let peer_id = PeerId {
697 owner_id: 10,
698 id: u32::MAX,
699 };
700 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
701 let peer_id = PeerId {
702 owner_id: u32::MAX,
703 id: u32::MAX,
704 };
705 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
706 }
707}