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