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