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    (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}