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