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 (RefreshInlayHints, Foreground),
257 (RejoinChannelBuffers, Foreground),
258 (RejoinChannelBuffersResponse, Foreground),
259 (RejoinRoom, Foreground),
260 (RejoinRoomResponse, Foreground),
261 (ReloadBuffers, Foreground),
262 (ReloadBuffersResponse, Foreground),
263 (RemoveChannelMember, Foreground),
264 (RemoveChannelMessage, Foreground),
265 (UpdateChannelMessage, Foreground),
266 (RemoveContact, Foreground),
267 (RemoveProjectCollaborator, Foreground),
268 (RenameChannel, Foreground),
269 (RenameChannelResponse, Foreground),
270 (RenameProjectEntry, Foreground),
271 (RequestContact, Foreground),
272 (ResolveCompletionDocumentation, Background),
273 (ResolveCompletionDocumentationResponse, Background),
274 (ResolveInlayHint, Background),
275 (ResolveInlayHintResponse, Background),
276 (RespondToChannelInvite, Foreground),
277 (RespondToContactRequest, Foreground),
278 (RoomUpdated, Foreground),
279 (SaveBuffer, Foreground),
280 (SetChannelMemberRole, Foreground),
281 (SetChannelVisibility, Foreground),
282 (SendChannelMessage, Background),
283 (SendChannelMessageResponse, Background),
284 (ShareProject, Foreground),
285 (ShareProjectResponse, Foreground),
286 (ShowContacts, Foreground),
287 (StartLanguageServer, Foreground),
288 (SubscribeToChannels, Foreground),
289 (SynchronizeBuffers, Foreground),
290 (SynchronizeBuffersResponse, Foreground),
291 (TaskContextForLocation, Background),
292 (TaskContext, Background),
293 (Test, Foreground),
294 (Unfollow, Foreground),
295 (UnshareProject, Foreground),
296 (UpdateBuffer, Foreground),
297 (UpdateBufferFile, Foreground),
298 (UpdateChannelBuffer, Foreground),
299 (UpdateChannelBufferCollaborators, Foreground),
300 (UpdateChannels, Foreground),
301 (UpdateUserChannels, Foreground),
302 (UpdateContacts, Foreground),
303 (UpdateDiagnosticSummary, Foreground),
304 (UpdateDiffBase, Foreground),
305 (UpdateFollowers, Foreground),
306 (UpdateInviteInfo, Foreground),
307 (UpdateLanguageServer, Foreground),
308 (UpdateParticipantLocation, Foreground),
309 (UpdateProject, Foreground),
310 (UpdateProjectCollaborator, Foreground),
311 (UpdateUserPlan, Foreground),
312 (UpdateWorktree, Foreground),
313 (UpdateWorktreeSettings, Foreground),
314 (UsersResponse, Foreground),
315 (LspExtExpandMacro, Background),
316 (LspExtExpandMacroResponse, Background),
317 (SetRoomParticipantRole, Foreground),
318 (BlameBuffer, Foreground),
319 (BlameBufferResponse, Foreground),
320 (CreateDevServerProject, Background),
321 (CreateDevServerProjectResponse, Foreground),
322 (CreateDevServer, Foreground),
323 (CreateDevServerResponse, Foreground),
324 (DevServerInstructions, Foreground),
325 (ShutdownDevServer, Foreground),
326 (ReconnectDevServer, Foreground),
327 (ReconnectDevServerResponse, Foreground),
328 (ShareDevServerProject, Foreground),
329 (JoinDevServerProject, Foreground),
330 (RejoinRemoteProjects, Foreground),
331 (RejoinRemoteProjectsResponse, Foreground),
332 (MultiLspQuery, Background),
333 (MultiLspQueryResponse, Background),
334 (DevServerProjectsUpdate, Foreground),
335 (ValidateDevServerProjectRequest, Background),
336 (ListRemoteDirectory, Background),
337 (ListRemoteDirectoryResponse, Background),
338 (UpdateDevServerProject, Background),
339 (DeleteDevServer, Foreground),
340 (DeleteDevServerProject, Foreground),
341 (RegenerateDevServerToken, Foreground),
342 (RegenerateDevServerTokenResponse, Foreground),
343 (RenameDevServer, Foreground),
344 (OpenNewBuffer, Foreground),
345 (RestartLanguageServers, Foreground),
346 (LinkedEditingRange, Background),
347 (LinkedEditingRangeResponse, Background),
348 (AdvertiseContexts, Foreground),
349 (OpenContext, Foreground),
350 (OpenContextResponse, Foreground),
351 (CreateContext, Foreground),
352 (CreateContextResponse, Foreground),
353 (UpdateContext, Foreground),
354 (SynchronizeContexts, Foreground),
355 (SynchronizeContextsResponse, Foreground),
356 (LspExtSwitchSourceHeader, Background),
357 (LspExtSwitchSourceHeaderResponse, Background),
358 (AddWorktree, Foreground),
359 (AddWorktreeResponse, Foreground),
360 (FindSearchCandidates, Background),
361 (FindSearchCandidatesResponse, Background),
362 (CloseBuffer, Foreground),
363 (UpdateUserSettings, Foreground),
364 (CheckFileExists, Background),
365 (CheckFileExistsResponse, Background),
366 (ShutdownRemoteServer, Foreground),
367);
368
369request_messages!(
370 (AcceptTermsOfService, AcceptTermsOfServiceResponse),
371 (ApplyCodeAction, ApplyCodeActionResponse),
372 (
373 ApplyCompletionAdditionalEdits,
374 ApplyCompletionAdditionalEditsResponse
375 ),
376 (Call, Ack),
377 (CancelCall, Ack),
378 (CopyProjectEntry, ProjectEntryResponse),
379 (ComputeEmbeddings, ComputeEmbeddingsResponse),
380 (CreateChannel, CreateChannelResponse),
381 (CreateProjectEntry, ProjectEntryResponse),
382 (CreateRoom, CreateRoomResponse),
383 (DeclineCall, Ack),
384 (DeleteChannel, Ack),
385 (DeleteProjectEntry, ProjectEntryResponse),
386 (ExpandProjectEntry, ExpandProjectEntryResponse),
387 (Follow, FollowResponse),
388 (FormatBuffers, FormatBuffersResponse),
389 (FuzzySearchUsers, UsersResponse),
390 (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
391 (GetChannelMembers, GetChannelMembersResponse),
392 (GetChannelMessages, GetChannelMessagesResponse),
393 (GetChannelMessagesById, GetChannelMessagesResponse),
394 (GetCodeActions, GetCodeActionsResponse),
395 (GetCompletions, GetCompletionsResponse),
396 (GetDefinition, GetDefinitionResponse),
397 (GetDeclaration, GetDeclarationResponse),
398 (GetImplementation, GetImplementationResponse),
399 (GetDocumentHighlights, GetDocumentHighlightsResponse),
400 (GetHover, GetHoverResponse),
401 (GetLlmToken, GetLlmTokenResponse),
402 (GetNotifications, GetNotificationsResponse),
403 (GetPrivateUserInfo, GetPrivateUserInfoResponse),
404 (GetProjectSymbols, GetProjectSymbolsResponse),
405 (GetReferences, GetReferencesResponse),
406 (GetSignatureHelp, GetSignatureHelpResponse),
407 (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
408 (GetTypeDefinition, GetTypeDefinitionResponse),
409 (LinkedEditingRange, LinkedEditingRangeResponse),
410 (ListRemoteDirectory, ListRemoteDirectoryResponse),
411 (UpdateDevServerProject, Ack),
412 (GetUsers, UsersResponse),
413 (IncomingCall, Ack),
414 (InlayHints, InlayHintsResponse),
415 (InviteChannelMember, Ack),
416 (JoinChannel, JoinRoomResponse),
417 (JoinChannelBuffer, JoinChannelBufferResponse),
418 (JoinChannelChat, JoinChannelChatResponse),
419 (JoinHostedProject, JoinProjectResponse),
420 (JoinProject, JoinProjectResponse),
421 (JoinRoom, JoinRoomResponse),
422 (LeaveChannelBuffer, Ack),
423 (LeaveRoom, Ack),
424 (MarkNotificationRead, Ack),
425 (MoveChannel, Ack),
426 (OnTypeFormatting, OnTypeFormattingResponse),
427 (OpenBufferById, OpenBufferResponse),
428 (OpenBufferByPath, OpenBufferResponse),
429 (OpenBufferForSymbol, OpenBufferForSymbolResponse),
430 (OpenNewBuffer, OpenBufferResponse),
431 (PerformRename, PerformRenameResponse),
432 (Ping, Ack),
433 (PrepareRename, PrepareRenameResponse),
434 (CountLanguageModelTokens, CountLanguageModelTokensResponse),
435 (RefreshInlayHints, Ack),
436 (RejoinChannelBuffers, RejoinChannelBuffersResponse),
437 (RejoinRoom, RejoinRoomResponse),
438 (ReloadBuffers, ReloadBuffersResponse),
439 (RemoveChannelMember, Ack),
440 (RemoveChannelMessage, Ack),
441 (UpdateChannelMessage, Ack),
442 (RemoveContact, Ack),
443 (RenameChannel, RenameChannelResponse),
444 (RenameProjectEntry, ProjectEntryResponse),
445 (RequestContact, Ack),
446 (
447 ResolveCompletionDocumentation,
448 ResolveCompletionDocumentationResponse
449 ),
450 (ResolveInlayHint, ResolveInlayHintResponse),
451 (RespondToChannelInvite, Ack),
452 (RespondToContactRequest, Ack),
453 (SaveBuffer, BufferSaved),
454 (FindSearchCandidates, FindSearchCandidatesResponse),
455 (SendChannelMessage, SendChannelMessageResponse),
456 (SetChannelMemberRole, Ack),
457 (SetChannelVisibility, Ack),
458 (ShareProject, ShareProjectResponse),
459 (SynchronizeBuffers, SynchronizeBuffersResponse),
460 (TaskContextForLocation, TaskContext),
461 (Test, Test),
462 (UpdateBuffer, Ack),
463 (UpdateParticipantLocation, Ack),
464 (UpdateProject, Ack),
465 (UpdateWorktree, Ack),
466 (LspExtExpandMacro, LspExtExpandMacroResponse),
467 (SetRoomParticipantRole, Ack),
468 (BlameBuffer, BlameBufferResponse),
469 (CreateDevServerProject, CreateDevServerProjectResponse),
470 (CreateDevServer, CreateDevServerResponse),
471 (ShutdownDevServer, Ack),
472 (ShareDevServerProject, ShareProjectResponse),
473 (JoinDevServerProject, JoinProjectResponse),
474 (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
475 (ReconnectDevServer, ReconnectDevServerResponse),
476 (ValidateDevServerProjectRequest, Ack),
477 (MultiLspQuery, MultiLspQueryResponse),
478 (DeleteDevServer, Ack),
479 (DeleteDevServerProject, Ack),
480 (RegenerateDevServerToken, RegenerateDevServerTokenResponse),
481 (RenameDevServer, Ack),
482 (RestartLanguageServers, Ack),
483 (OpenContext, OpenContextResponse),
484 (CreateContext, CreateContextResponse),
485 (SynchronizeContexts, SynchronizeContextsResponse),
486 (LspExtSwitchSourceHeader, LspExtSwitchSourceHeaderResponse),
487 (AddWorktree, AddWorktreeResponse),
488 (CheckFileExists, CheckFileExistsResponse),
489 (ShutdownRemoteServer, Ack)
490);
491
492entity_messages!(
493 {project_id, ShareProject},
494 AddProjectCollaborator,
495 AddWorktree,
496 ApplyCodeAction,
497 ApplyCompletionAdditionalEdits,
498 BlameBuffer,
499 BufferReloaded,
500 BufferSaved,
501 CloseBuffer,
502 CopyProjectEntry,
503 CreateBufferForPeer,
504 CreateProjectEntry,
505 DeleteProjectEntry,
506 ExpandProjectEntry,
507 FindSearchCandidates,
508 FormatBuffers,
509 GetCodeActions,
510 GetCompletions,
511 GetDefinition,
512 GetDeclaration,
513 GetImplementation,
514 GetDocumentHighlights,
515 GetHover,
516 GetProjectSymbols,
517 GetReferences,
518 GetSignatureHelp,
519 GetTypeDefinition,
520 InlayHints,
521 JoinProject,
522 LeaveProject,
523 LinkedEditingRange,
524 MultiLspQuery,
525 RestartLanguageServers,
526 OnTypeFormatting,
527 OpenNewBuffer,
528 OpenBufferById,
529 OpenBufferByPath,
530 OpenBufferForSymbol,
531 PerformRename,
532 PrepareRename,
533 RefreshInlayHints,
534 ReloadBuffers,
535 RemoveProjectCollaborator,
536 RenameProjectEntry,
537 ResolveCompletionDocumentation,
538 ResolveInlayHint,
539 SaveBuffer,
540 StartLanguageServer,
541 SynchronizeBuffers,
542 TaskContextForLocation,
543 UnshareProject,
544 UpdateBuffer,
545 UpdateBufferFile,
546 UpdateDiagnosticSummary,
547 UpdateDiffBase,
548 UpdateLanguageServer,
549 UpdateProject,
550 UpdateProjectCollaborator,
551 UpdateWorktree,
552 UpdateWorktreeSettings,
553 LspExtExpandMacro,
554 AdvertiseContexts,
555 OpenContext,
556 CreateContext,
557 UpdateContext,
558 SynchronizeContexts,
559 LspExtSwitchSourceHeader,
560 UpdateUserSettings,
561 CheckFileExists,
562);
563
564entity_messages!(
565 {channel_id, Channel},
566 ChannelMessageSent,
567 ChannelMessageUpdate,
568 RemoveChannelMessage,
569 UpdateChannelMessage,
570 UpdateChannelBuffer,
571 UpdateChannelBufferCollaborators,
572);
573
574impl From<Timestamp> for SystemTime {
575 fn from(val: Timestamp) -> Self {
576 UNIX_EPOCH
577 .checked_add(Duration::new(val.seconds, val.nanos))
578 .unwrap()
579 }
580}
581
582impl From<SystemTime> for Timestamp {
583 fn from(time: SystemTime) -> Self {
584 let duration = time.duration_since(UNIX_EPOCH).unwrap();
585 Self {
586 seconds: duration.as_secs(),
587 nanos: duration.subsec_nanos(),
588 }
589 }
590}
591
592impl From<u128> for Nonce {
593 fn from(nonce: u128) -> Self {
594 let upper_half = (nonce >> 64) as u64;
595 let lower_half = nonce as u64;
596 Self {
597 upper_half,
598 lower_half,
599 }
600 }
601}
602
603impl From<Nonce> for u128 {
604 fn from(nonce: Nonce) -> Self {
605 let upper_half = (nonce.upper_half as u128) << 64;
606 let lower_half = nonce.lower_half as u128;
607 upper_half | lower_half
608 }
609}
610
611pub fn split_worktree_update(
612 mut message: UpdateWorktree,
613 max_chunk_size: usize,
614) -> impl Iterator<Item = UpdateWorktree> {
615 let mut done_files = false;
616
617 let mut repository_map = message
618 .updated_repositories
619 .into_iter()
620 .map(|repo| (repo.work_directory_id, repo))
621 .collect::<HashMap<_, _>>();
622
623 iter::from_fn(move || {
624 if done_files {
625 return None;
626 }
627
628 let updated_entries_chunk_size = cmp::min(message.updated_entries.len(), max_chunk_size);
629 let updated_entries: Vec<_> = message
630 .updated_entries
631 .drain(..updated_entries_chunk_size)
632 .collect();
633
634 let removed_entries_chunk_size = cmp::min(message.removed_entries.len(), max_chunk_size);
635 let removed_entries = message
636 .removed_entries
637 .drain(..removed_entries_chunk_size)
638 .collect();
639
640 done_files = message.updated_entries.is_empty() && message.removed_entries.is_empty();
641
642 let mut updated_repositories = Vec::new();
643
644 if !repository_map.is_empty() {
645 for entry in &updated_entries {
646 if let Some(repo) = repository_map.remove(&entry.id) {
647 updated_repositories.push(repo)
648 }
649 }
650 }
651
652 let removed_repositories = if done_files {
653 mem::take(&mut message.removed_repositories)
654 } else {
655 Default::default()
656 };
657
658 if done_files {
659 updated_repositories.extend(mem::take(&mut repository_map).into_values());
660 }
661
662 Some(UpdateWorktree {
663 project_id: message.project_id,
664 worktree_id: message.worktree_id,
665 root_name: message.root_name.clone(),
666 abs_path: message.abs_path.clone(),
667 updated_entries,
668 removed_entries,
669 scan_id: message.scan_id,
670 is_last_update: done_files && message.is_last_update,
671 updated_repositories,
672 removed_repositories,
673 })
674 })
675}
676
677#[cfg(test)]
678mod tests {
679 use super::*;
680
681 #[test]
682 fn test_converting_peer_id_from_and_to_u64() {
683 let peer_id = PeerId {
684 owner_id: 10,
685 id: 3,
686 };
687 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
688 let peer_id = PeerId {
689 owner_id: u32::MAX,
690 id: 3,
691 };
692 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
693 let peer_id = PeerId {
694 owner_id: 10,
695 id: u32::MAX,
696 };
697 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
698 let peer_id = PeerId {
699 owner_id: u32::MAX,
700 id: u32::MAX,
701 };
702 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
703 }
704}