proto.rs

  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}