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    (Commit, Background),
160    (ComputeEmbeddings, Background),
161    (ComputeEmbeddingsResponse, Background),
162    (CopyProjectEntry, Foreground),
163    (CreateBufferForPeer, Foreground),
164    (CreateChannel, Foreground),
165    (CreateChannelResponse, Foreground),
166    (CreateProjectEntry, Foreground),
167    (CreateRoom, Foreground),
168    (CreateRoomResponse, Foreground),
169    (DeclineCall, Foreground),
170    (DeleteChannel, Foreground),
171    (DeleteNotification, Foreground),
172    (UpdateNotification, Foreground),
173    (DeleteProjectEntry, Foreground),
174    (EndStream, Foreground),
175    (Error, Foreground),
176    (ExpandProjectEntry, Foreground),
177    (ExpandProjectEntryResponse, Foreground),
178    (ExpandAllForProjectEntry, Foreground),
179    (ExpandAllForProjectEntryResponse, Foreground),
180    (Follow, Foreground),
181    (FollowResponse, Foreground),
182    (FormatBuffers, Foreground),
183    (FormatBuffersResponse, Foreground),
184    (FuzzySearchUsers, Foreground),
185    (GetCachedEmbeddings, Background),
186    (GetCachedEmbeddingsResponse, Background),
187    (GetChannelMembers, Foreground),
188    (GetChannelMembersResponse, Foreground),
189    (GetChannelMessages, Background),
190    (GetChannelMessagesById, Background),
191    (GetChannelMessagesResponse, Background),
192    (GetCodeActions, Background),
193    (GetCodeActionsResponse, Background),
194    (GetCompletions, Background),
195    (GetCompletionsResponse, Background),
196    (GetDefinition, Background),
197    (GetDefinitionResponse, Background),
198    (GetDeclaration, Background),
199    (GetDeclarationResponse, Background),
200    (GetDocumentHighlights, Background),
201    (GetDocumentHighlightsResponse, Background),
202    (GetHover, Background),
203    (GetHoverResponse, Background),
204    (GetNotifications, Foreground),
205    (GetNotificationsResponse, Foreground),
206    (GetPrivateUserInfo, Foreground),
207    (GetPrivateUserInfoResponse, Foreground),
208    (GetProjectSymbols, Background),
209    (GetProjectSymbolsResponse, Background),
210    (GetReferences, Background),
211    (GetReferencesResponse, Background),
212    (GetSignatureHelp, Background),
213    (GetSignatureHelpResponse, Background),
214    (GetSupermavenApiKey, Background),
215    (GetSupermavenApiKeyResponse, Background),
216    (GetTypeDefinition, Background),
217    (GetTypeDefinitionResponse, Background),
218    (GetImplementation, Background),
219    (GetImplementationResponse, Background),
220    (GetLlmToken, Background),
221    (GetLlmTokenResponse, Background),
222    (OpenUnstagedDiff, Foreground),
223    (OpenUnstagedDiffResponse, Foreground),
224    (OpenUncommittedDiff, Foreground),
225    (OpenUncommittedDiffResponse, Foreground),
226    (GetUsers, Foreground),
227    (Hello, Foreground),
228    (IncomingCall, Foreground),
229    (InlayHints, Background),
230    (InlayHintsResponse, Background),
231    (InviteChannelMember, Foreground),
232    (JoinChannel, Foreground),
233    (JoinChannelBuffer, Foreground),
234    (JoinChannelBufferResponse, Foreground),
235    (JoinChannelChat, Foreground),
236    (JoinChannelChatResponse, Foreground),
237    (JoinProject, Foreground),
238    (JoinProjectResponse, Foreground),
239    (JoinRoom, Foreground),
240    (JoinRoomResponse, Foreground),
241    (LeaveChannelBuffer, Background),
242    (LeaveChannelChat, Foreground),
243    (LeaveProject, Foreground),
244    (LeaveRoom, Foreground),
245    (MarkNotificationRead, Foreground),
246    (MoveChannel, Foreground),
247    (OnTypeFormatting, Background),
248    (OnTypeFormattingResponse, Background),
249    (OpenBufferById, Background),
250    (OpenBufferByPath, Background),
251    (OpenBufferForSymbol, Background),
252    (OpenBufferForSymbolResponse, Background),
253    (OpenBufferResponse, Background),
254    (OpenCommitMessageBuffer, Background),
255    (PerformRename, Background),
256    (PerformRenameResponse, Background),
257    (Ping, Foreground),
258    (PrepareRename, Background),
259    (PrepareRenameResponse, Background),
260    (ProjectEntryResponse, Foreground),
261    (CountLanguageModelTokens, Background),
262    (CountLanguageModelTokensResponse, Background),
263    (RefreshLlmToken, Background),
264    (RefreshInlayHints, Foreground),
265    (RejoinChannelBuffers, Foreground),
266    (RejoinChannelBuffersResponse, Foreground),
267    (RejoinRoom, Foreground),
268    (RejoinRoomResponse, Foreground),
269    (ReloadBuffers, Foreground),
270    (ReloadBuffersResponse, Foreground),
271    (RemoveChannelMember, Foreground),
272    (RemoveChannelMessage, Foreground),
273    (UpdateChannelMessage, Foreground),
274    (RemoveContact, Foreground),
275    (RemoveProjectCollaborator, Foreground),
276    (RenameChannel, Foreground),
277    (RenameChannelResponse, Foreground),
278    (RenameProjectEntry, Foreground),
279    (RequestContact, Foreground),
280    (ResolveCompletionDocumentation, Background),
281    (ResolveCompletionDocumentationResponse, Background),
282    (ResolveInlayHint, Background),
283    (ResolveInlayHintResponse, Background),
284    (RespondToChannelInvite, Foreground),
285    (RespondToContactRequest, Foreground),
286    (RoomUpdated, Foreground),
287    (SaveBuffer, Foreground),
288    (SetChannelMemberRole, Foreground),
289    (SetChannelVisibility, Foreground),
290    (SendChannelMessage, Background),
291    (SendChannelMessageResponse, Background),
292    (ShareProject, Foreground),
293    (ShareProjectResponse, Foreground),
294    (ShowContacts, Foreground),
295    (Stage, Background),
296    (StartLanguageServer, Foreground),
297    (SubscribeToChannels, Foreground),
298    (SynchronizeBuffers, Foreground),
299    (SynchronizeBuffersResponse, Foreground),
300    (TaskContextForLocation, Background),
301    (TaskContext, Background),
302    (Test, Foreground),
303    (Unfollow, Foreground),
304    (UnshareProject, Foreground),
305    (Unstage, Background),
306    (UpdateBuffer, Foreground),
307    (UpdateBufferFile, Foreground),
308    (UpdateChannelBuffer, Foreground),
309    (UpdateChannelBufferCollaborators, Foreground),
310    (UpdateChannels, Foreground),
311    (UpdateUserChannels, Foreground),
312    (UpdateContacts, Foreground),
313    (UpdateDiagnosticSummary, Foreground),
314    (UpdateDiffBases, Foreground),
315    (UpdateFollowers, Foreground),
316    (UpdateInviteInfo, Foreground),
317    (UpdateLanguageServer, Foreground),
318    (UpdateParticipantLocation, Foreground),
319    (UpdateProject, Foreground),
320    (UpdateProjectCollaborator, Foreground),
321    (UpdateUserPlan, Foreground),
322    (UpdateWorktree, Foreground),
323    (UpdateWorktreeSettings, Foreground),
324    (UsersResponse, Foreground),
325    (LspExtExpandMacro, Background),
326    (LspExtExpandMacroResponse, Background),
327    (LspExtOpenDocs, Background),
328    (LspExtOpenDocsResponse, Background),
329    (SetRoomParticipantRole, Foreground),
330    (BlameBuffer, Foreground),
331    (BlameBufferResponse, Foreground),
332    (RejoinRemoteProjects, Foreground),
333    (RejoinRemoteProjectsResponse, Foreground),
334    (MultiLspQuery, Background),
335    (MultiLspQueryResponse, Background),
336    (ListRemoteDirectory, Background),
337    (ListRemoteDirectoryResponse, Background),
338    (OpenNewBuffer, Foreground),
339    (RestartLanguageServers, Foreground),
340    (LinkedEditingRange, Background),
341    (LinkedEditingRangeResponse, Background),
342    (AdvertiseContexts, Foreground),
343    (OpenContext, Foreground),
344    (OpenContextResponse, Foreground),
345    (CreateContext, Foreground),
346    (CreateContextResponse, Foreground),
347    (UpdateContext, Foreground),
348    (SynchronizeContexts, Foreground),
349    (SynchronizeContextsResponse, Foreground),
350    (LspExtSwitchSourceHeader, Background),
351    (LspExtSwitchSourceHeaderResponse, Background),
352    (AddWorktree, Foreground),
353    (AddWorktreeResponse, Foreground),
354    (FindSearchCandidates, Background),
355    (FindSearchCandidatesResponse, Background),
356    (CloseBuffer, Foreground),
357    (ShutdownRemoteServer, Foreground),
358    (RemoveWorktree, Foreground),
359    (LanguageServerLog, Foreground),
360    (Toast, Background),
361    (HideToast, Background),
362    (OpenServerSettings, Foreground),
363    (GetPermalinkToLine, Foreground),
364    (GetPermalinkToLineResponse, Foreground),
365    (FlushBufferedMessages, Foreground),
366    (LanguageServerPromptRequest, Foreground),
367    (LanguageServerPromptResponse, Foreground),
368    (GitBranches, Background),
369    (GitBranchesResponse, Background),
370    (UpdateGitBranch, Background),
371    (ListToolchains, Foreground),
372    (ListToolchainsResponse, Foreground),
373    (ActivateToolchain, Foreground),
374    (ActiveToolchain, Foreground),
375    (ActiveToolchainResponse, Foreground),
376    (GetPathMetadata, Background),
377    (GetPathMetadataResponse, Background),
378    (GetPanicFiles, Background),
379    (GetPanicFilesResponse, Background),
380    (CancelLanguageServerWork, Foreground),
381    (SyncExtensions, Background),
382    (SyncExtensionsResponse, Background),
383    (InstallExtension, Background),
384    (RegisterBufferWithLanguageServers, Background),
385);
386
387request_messages!(
388    (AcceptTermsOfService, AcceptTermsOfServiceResponse),
389    (ApplyCodeAction, ApplyCodeActionResponse),
390    (
391        ApplyCompletionAdditionalEdits,
392        ApplyCompletionAdditionalEditsResponse
393    ),
394    (Call, Ack),
395    (CancelCall, Ack),
396    (Commit, Ack),
397    (CopyProjectEntry, ProjectEntryResponse),
398    (ComputeEmbeddings, ComputeEmbeddingsResponse),
399    (CreateChannel, CreateChannelResponse),
400    (CreateProjectEntry, ProjectEntryResponse),
401    (CreateRoom, CreateRoomResponse),
402    (DeclineCall, Ack),
403    (DeleteChannel, Ack),
404    (DeleteProjectEntry, ProjectEntryResponse),
405    (ExpandProjectEntry, ExpandProjectEntryResponse),
406    (ExpandAllForProjectEntry, ExpandAllForProjectEntryResponse),
407    (Follow, FollowResponse),
408    (FormatBuffers, FormatBuffersResponse),
409    (FuzzySearchUsers, UsersResponse),
410    (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
411    (GetChannelMembers, GetChannelMembersResponse),
412    (GetChannelMessages, GetChannelMessagesResponse),
413    (GetChannelMessagesById, GetChannelMessagesResponse),
414    (GetCodeActions, GetCodeActionsResponse),
415    (GetCompletions, GetCompletionsResponse),
416    (GetDefinition, GetDefinitionResponse),
417    (GetDeclaration, GetDeclarationResponse),
418    (GetImplementation, GetImplementationResponse),
419    (GetDocumentHighlights, GetDocumentHighlightsResponse),
420    (GetHover, GetHoverResponse),
421    (GetLlmToken, GetLlmTokenResponse),
422    (GetNotifications, GetNotificationsResponse),
423    (GetPrivateUserInfo, GetPrivateUserInfoResponse),
424    (GetProjectSymbols, GetProjectSymbolsResponse),
425    (GetReferences, GetReferencesResponse),
426    (GetSignatureHelp, GetSignatureHelpResponse),
427    (OpenUnstagedDiff, OpenUnstagedDiffResponse),
428    (OpenUncommittedDiff, OpenUncommittedDiffResponse),
429    (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
430    (GetTypeDefinition, GetTypeDefinitionResponse),
431    (LinkedEditingRange, LinkedEditingRangeResponse),
432    (ListRemoteDirectory, ListRemoteDirectoryResponse),
433    (GetUsers, UsersResponse),
434    (IncomingCall, Ack),
435    (InlayHints, InlayHintsResponse),
436    (InviteChannelMember, Ack),
437    (JoinChannel, JoinRoomResponse),
438    (JoinChannelBuffer, JoinChannelBufferResponse),
439    (JoinChannelChat, JoinChannelChatResponse),
440    (JoinProject, JoinProjectResponse),
441    (JoinRoom, JoinRoomResponse),
442    (LeaveChannelBuffer, Ack),
443    (LeaveRoom, Ack),
444    (MarkNotificationRead, Ack),
445    (MoveChannel, Ack),
446    (OnTypeFormatting, OnTypeFormattingResponse),
447    (OpenBufferById, OpenBufferResponse),
448    (OpenBufferByPath, OpenBufferResponse),
449    (OpenBufferForSymbol, OpenBufferForSymbolResponse),
450    (OpenCommitMessageBuffer, OpenBufferResponse),
451    (OpenNewBuffer, OpenBufferResponse),
452    (PerformRename, PerformRenameResponse),
453    (Ping, Ack),
454    (PrepareRename, PrepareRenameResponse),
455    (CountLanguageModelTokens, CountLanguageModelTokensResponse),
456    (RefreshInlayHints, Ack),
457    (RejoinChannelBuffers, RejoinChannelBuffersResponse),
458    (RejoinRoom, RejoinRoomResponse),
459    (ReloadBuffers, ReloadBuffersResponse),
460    (RemoveChannelMember, Ack),
461    (RemoveChannelMessage, Ack),
462    (UpdateChannelMessage, Ack),
463    (RemoveContact, Ack),
464    (RenameChannel, RenameChannelResponse),
465    (RenameProjectEntry, ProjectEntryResponse),
466    (RequestContact, Ack),
467    (
468        ResolveCompletionDocumentation,
469        ResolveCompletionDocumentationResponse
470    ),
471    (ResolveInlayHint, ResolveInlayHintResponse),
472    (RespondToChannelInvite, Ack),
473    (RespondToContactRequest, Ack),
474    (SaveBuffer, BufferSaved),
475    (Stage, Ack),
476    (FindSearchCandidates, FindSearchCandidatesResponse),
477    (SendChannelMessage, SendChannelMessageResponse),
478    (SetChannelMemberRole, Ack),
479    (SetChannelVisibility, Ack),
480    (ShareProject, ShareProjectResponse),
481    (SynchronizeBuffers, SynchronizeBuffersResponse),
482    (TaskContextForLocation, TaskContext),
483    (Test, Test),
484    (Unstage, Ack),
485    (UpdateBuffer, Ack),
486    (UpdateParticipantLocation, Ack),
487    (UpdateProject, Ack),
488    (UpdateWorktree, Ack),
489    (LspExtExpandMacro, LspExtExpandMacroResponse),
490    (LspExtOpenDocs, LspExtOpenDocsResponse),
491    (SetRoomParticipantRole, Ack),
492    (BlameBuffer, BlameBufferResponse),
493    (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
494    (MultiLspQuery, MultiLspQueryResponse),
495    (RestartLanguageServers, Ack),
496    (OpenContext, OpenContextResponse),
497    (CreateContext, CreateContextResponse),
498    (SynchronizeContexts, SynchronizeContextsResponse),
499    (LspExtSwitchSourceHeader, LspExtSwitchSourceHeaderResponse),
500    (AddWorktree, AddWorktreeResponse),
501    (ShutdownRemoteServer, Ack),
502    (RemoveWorktree, Ack),
503    (OpenServerSettings, OpenBufferResponse),
504    (GetPermalinkToLine, GetPermalinkToLineResponse),
505    (FlushBufferedMessages, Ack),
506    (LanguageServerPromptRequest, LanguageServerPromptResponse),
507    (GitBranches, GitBranchesResponse),
508    (UpdateGitBranch, Ack),
509    (ListToolchains, ListToolchainsResponse),
510    (ActivateToolchain, Ack),
511    (ActiveToolchain, ActiveToolchainResponse),
512    (GetPathMetadata, GetPathMetadataResponse),
513    (GetPanicFiles, GetPanicFilesResponse),
514    (CancelLanguageServerWork, Ack),
515    (SyncExtensions, SyncExtensionsResponse),
516    (InstallExtension, Ack),
517    (RegisterBufferWithLanguageServers, Ack),
518);
519
520entity_messages!(
521    {project_id, ShareProject},
522    AddProjectCollaborator,
523    AddWorktree,
524    ApplyCodeAction,
525    ApplyCompletionAdditionalEdits,
526    BlameBuffer,
527    BufferReloaded,
528    BufferSaved,
529    CloseBuffer,
530    Commit,
531    CopyProjectEntry,
532    CreateBufferForPeer,
533    CreateProjectEntry,
534    DeleteProjectEntry,
535    ExpandProjectEntry,
536    ExpandAllForProjectEntry,
537    FindSearchCandidates,
538    FormatBuffers,
539    GetCodeActions,
540    GetCompletions,
541    GetDefinition,
542    GetDeclaration,
543    GetImplementation,
544    GetDocumentHighlights,
545    GetHover,
546    GetProjectSymbols,
547    GetReferences,
548    GetSignatureHelp,
549    OpenUnstagedDiff,
550    OpenUncommittedDiff,
551    GetTypeDefinition,
552    InlayHints,
553    JoinProject,
554    LeaveProject,
555    LinkedEditingRange,
556    MultiLspQuery,
557    RestartLanguageServers,
558    OnTypeFormatting,
559    OpenNewBuffer,
560    OpenBufferById,
561    OpenBufferByPath,
562    OpenBufferForSymbol,
563    OpenCommitMessageBuffer,
564    PerformRename,
565    PrepareRename,
566    RefreshInlayHints,
567    ReloadBuffers,
568    RemoveProjectCollaborator,
569    RenameProjectEntry,
570    ResolveCompletionDocumentation,
571    ResolveInlayHint,
572    SaveBuffer,
573    Stage,
574    StartLanguageServer,
575    SynchronizeBuffers,
576    TaskContextForLocation,
577    UnshareProject,
578    Unstage,
579    UpdateBuffer,
580    UpdateBufferFile,
581    UpdateDiagnosticSummary,
582    UpdateDiffBases,
583    UpdateLanguageServer,
584    UpdateProject,
585    UpdateProjectCollaborator,
586    UpdateWorktree,
587    UpdateWorktreeSettings,
588    LspExtExpandMacro,
589    LspExtOpenDocs,
590    AdvertiseContexts,
591    OpenContext,
592    CreateContext,
593    UpdateContext,
594    SynchronizeContexts,
595    LspExtSwitchSourceHeader,
596    LanguageServerLog,
597    Toast,
598    HideToast,
599    OpenServerSettings,
600    GetPermalinkToLine,
601    LanguageServerPromptRequest,
602    GitBranches,
603    UpdateGitBranch,
604    ListToolchains,
605    ActivateToolchain,
606    ActiveToolchain,
607    GetPathMetadata,
608    CancelLanguageServerWork,
609    RegisterBufferWithLanguageServers,
610);
611
612entity_messages!(
613    {channel_id, Channel},
614    ChannelMessageSent,
615    ChannelMessageUpdate,
616    RemoveChannelMessage,
617    UpdateChannelMessage,
618    UpdateChannelBuffer,
619    UpdateChannelBufferCollaborators,
620);
621
622impl From<Timestamp> for SystemTime {
623    fn from(val: Timestamp) -> Self {
624        UNIX_EPOCH
625            .checked_add(Duration::new(val.seconds, val.nanos))
626            .unwrap()
627    }
628}
629
630impl From<SystemTime> for Timestamp {
631    fn from(time: SystemTime) -> Self {
632        let duration = time.duration_since(UNIX_EPOCH).unwrap();
633        Self {
634            seconds: duration.as_secs(),
635            nanos: duration.subsec_nanos(),
636        }
637    }
638}
639
640impl From<u128> for Nonce {
641    fn from(nonce: u128) -> Self {
642        let upper_half = (nonce >> 64) as u64;
643        let lower_half = nonce as u64;
644        Self {
645            upper_half,
646            lower_half,
647        }
648    }
649}
650
651impl From<Nonce> for u128 {
652    fn from(nonce: Nonce) -> Self {
653        let upper_half = (nonce.upper_half as u128) << 64;
654        let lower_half = nonce.lower_half as u128;
655        upper_half | lower_half
656    }
657}
658
659#[cfg(any(test, feature = "test-support"))]
660pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 2;
661#[cfg(not(any(test, feature = "test-support")))]
662pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 256;
663
664pub fn split_worktree_update(mut message: UpdateWorktree) -> impl Iterator<Item = UpdateWorktree> {
665    let mut done_files = false;
666
667    let mut repository_map = message
668        .updated_repositories
669        .into_iter()
670        .map(|repo| (repo.work_directory_id, repo))
671        .collect::<HashMap<_, _>>();
672
673    iter::from_fn(move || {
674        if done_files {
675            return None;
676        }
677
678        let updated_entries_chunk_size = cmp::min(
679            message.updated_entries.len(),
680            MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
681        );
682        let updated_entries: Vec<_> = message
683            .updated_entries
684            .drain(..updated_entries_chunk_size)
685            .collect();
686
687        let removed_entries_chunk_size = cmp::min(
688            message.removed_entries.len(),
689            MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
690        );
691        let removed_entries = message
692            .removed_entries
693            .drain(..removed_entries_chunk_size)
694            .collect();
695
696        done_files = message.updated_entries.is_empty() && message.removed_entries.is_empty();
697
698        let mut updated_repositories = Vec::new();
699
700        if !repository_map.is_empty() {
701            for entry in &updated_entries {
702                if let Some(repo) = repository_map.remove(&entry.id) {
703                    updated_repositories.push(repo);
704                }
705            }
706        }
707
708        let removed_repositories = if done_files {
709            mem::take(&mut message.removed_repositories)
710        } else {
711            Default::default()
712        };
713
714        if done_files {
715            updated_repositories.extend(mem::take(&mut repository_map).into_values());
716        }
717
718        Some(UpdateWorktree {
719            project_id: message.project_id,
720            worktree_id: message.worktree_id,
721            root_name: message.root_name.clone(),
722            abs_path: message.abs_path.clone(),
723            updated_entries,
724            removed_entries,
725            scan_id: message.scan_id,
726            is_last_update: done_files && message.is_last_update,
727            updated_repositories,
728            removed_repositories,
729        })
730    })
731}
732
733#[cfg(test)]
734mod tests {
735    use super::*;
736
737    #[test]
738    fn test_converting_peer_id_from_and_to_u64() {
739        let peer_id = PeerId {
740            owner_id: 10,
741            id: 3,
742        };
743        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
744        let peer_id = PeerId {
745            owner_id: u32::MAX,
746            id: 3,
747        };
748        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
749        let peer_id = PeerId {
750            owner_id: 10,
751            id: u32::MAX,
752        };
753        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
754        let peer_id = PeerId {
755            owner_id: u32::MAX,
756            id: u32::MAX,
757        };
758        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
759    }
760}