proto.rs

  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}