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
 10pub use prost::{DecodeError, Message};
 11use serde::Serialize;
 12use std::{
 13    any::{Any, TypeId},
 14    cmp,
 15    fmt::{self, Debug},
 16    iter, mem,
 17    path::{Path, PathBuf},
 18    sync::Arc,
 19    time::{Duration, SystemTime, UNIX_EPOCH},
 20};
 21
 22include!(concat!(env!("OUT_DIR"), "/zed.messages.rs"));
 23
 24pub const SSH_PEER_ID: PeerId = PeerId { owner_id: 0, id: 0 };
 25pub const SSH_PROJECT_ID: u64 = 0;
 26
 27pub trait EnvelopedMessage: Clone + Debug + Serialize + Sized + Send + Sync + 'static {
 28    const NAME: &'static str;
 29    const PRIORITY: MessagePriority;
 30    fn into_envelope(
 31        self,
 32        id: u32,
 33        responding_to: Option<u32>,
 34        original_sender_id: Option<PeerId>,
 35    ) -> Envelope;
 36    fn from_envelope(envelope: Envelope) -> Option<Self>;
 37}
 38
 39pub trait EntityMessage: EnvelopedMessage {
 40    type Entity;
 41    fn remote_entity_id(&self) -> u64;
 42}
 43
 44pub trait RequestMessage: EnvelopedMessage {
 45    type Response: EnvelopedMessage;
 46}
 47
 48pub trait AnyTypedEnvelope: 'static + Send + Sync {
 49    fn payload_type_id(&self) -> TypeId;
 50    fn payload_type_name(&self) -> &'static str;
 51    fn as_any(&self) -> &dyn Any;
 52    fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync>;
 53    fn is_background(&self) -> bool;
 54    fn original_sender_id(&self) -> Option<PeerId>;
 55    fn sender_id(&self) -> PeerId;
 56    fn message_id(&self) -> u32;
 57}
 58
 59pub enum MessagePriority {
 60    Foreground,
 61    Background,
 62}
 63
 64impl<T: EnvelopedMessage> AnyTypedEnvelope for TypedEnvelope<T> {
 65    fn payload_type_id(&self) -> TypeId {
 66        TypeId::of::<T>()
 67    }
 68
 69    fn payload_type_name(&self) -> &'static str {
 70        T::NAME
 71    }
 72
 73    fn as_any(&self) -> &dyn Any {
 74        self
 75    }
 76
 77    fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync> {
 78        self
 79    }
 80
 81    fn is_background(&self) -> bool {
 82        matches!(T::PRIORITY, MessagePriority::Background)
 83    }
 84
 85    fn original_sender_id(&self) -> Option<PeerId> {
 86        self.original_sender_id
 87    }
 88
 89    fn sender_id(&self) -> PeerId {
 90        self.sender_id
 91    }
 92
 93    fn message_id(&self) -> u32 {
 94        self.message_id
 95    }
 96}
 97
 98impl PeerId {
 99    pub fn from_u64(peer_id: u64) -> Self {
100        let owner_id = (peer_id >> 32) as u32;
101        let id = peer_id as u32;
102        Self { owner_id, id }
103    }
104
105    pub fn as_u64(self) -> u64 {
106        ((self.owner_id as u64) << 32) | (self.id as u64)
107    }
108}
109
110impl Copy for PeerId {}
111
112impl Eq for PeerId {}
113
114impl Ord for PeerId {
115    fn cmp(&self, other: &Self) -> cmp::Ordering {
116        self.owner_id
117            .cmp(&other.owner_id)
118            .then_with(|| self.id.cmp(&other.id))
119    }
120}
121
122impl PartialOrd for PeerId {
123    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
124        Some(self.cmp(other))
125    }
126}
127
128impl std::hash::Hash for PeerId {
129    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
130        self.owner_id.hash(state);
131        self.id.hash(state);
132    }
133}
134
135impl fmt::Display for PeerId {
136    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
137        write!(f, "{}/{}", self.owner_id, self.id)
138    }
139}
140
141pub trait FromProto {
142    fn from_proto(proto: String) -> Self;
143}
144
145pub trait ToProto {
146    fn to_proto(self) -> String;
147}
148
149impl FromProto for PathBuf {
150    #[cfg(target_os = "windows")]
151    fn from_proto(proto: String) -> Self {
152        proto.split("/").collect()
153    }
154
155    #[cfg(not(target_os = "windows"))]
156    fn from_proto(proto: String) -> Self {
157        PathBuf::from(proto)
158    }
159}
160
161impl FromProto for Arc<Path> {
162    fn from_proto(proto: String) -> Self {
163        PathBuf::from_proto(proto).into()
164    }
165}
166
167impl ToProto for PathBuf {
168    #[cfg(target_os = "windows")]
169    fn to_proto(self) -> String {
170        self.components()
171            .map(|comp| comp.as_os_str().to_string_lossy().to_string())
172            .collect::<Vec<_>>()
173            .join("/")
174    }
175
176    #[cfg(not(target_os = "windows"))]
177    fn to_proto(self) -> String {
178        self.to_string_lossy().to_string()
179    }
180}
181
182impl ToProto for &Path {
183    #[cfg(target_os = "windows")]
184    fn to_proto(self) -> String {
185        self.components()
186            .map(|comp| comp.as_os_str().to_string_lossy().to_string())
187            .collect::<Vec<_>>()
188            .join("/")
189    }
190
191    #[cfg(not(target_os = "windows"))]
192    fn to_proto(self) -> String {
193        self.to_string_lossy().to_string()
194    }
195}
196
197messages!(
198    (AcceptTermsOfService, Foreground),
199    (AcceptTermsOfServiceResponse, Foreground),
200    (Ack, Foreground),
201    (AckBufferOperation, Background),
202    (AckChannelMessage, Background),
203    (AddNotification, Foreground),
204    (AddProjectCollaborator, Foreground),
205    (ApplyCodeAction, Background),
206    (ApplyCodeActionResponse, Background),
207    (ApplyCompletionAdditionalEdits, Background),
208    (ApplyCompletionAdditionalEditsResponse, Background),
209    (BufferReloaded, Foreground),
210    (BufferSaved, Foreground),
211    (Call, Foreground),
212    (CallCanceled, Foreground),
213    (CancelCall, Foreground),
214    (ChannelMessageSent, Foreground),
215    (ChannelMessageUpdate, Foreground),
216    (Commit, Background),
217    (ComputeEmbeddings, Background),
218    (ComputeEmbeddingsResponse, Background),
219    (CopyProjectEntry, Foreground),
220    (CreateBufferForPeer, Foreground),
221    (CreateChannel, Foreground),
222    (CreateChannelResponse, Foreground),
223    (CreateProjectEntry, Foreground),
224    (CreateRoom, Foreground),
225    (CreateRoomResponse, Foreground),
226    (DeclineCall, Foreground),
227    (DeleteChannel, Foreground),
228    (DeleteNotification, Foreground),
229    (UpdateNotification, Foreground),
230    (DeleteProjectEntry, Foreground),
231    (EndStream, Foreground),
232    (Error, Foreground),
233    (ExpandProjectEntry, Foreground),
234    (ExpandProjectEntryResponse, Foreground),
235    (ExpandAllForProjectEntry, Foreground),
236    (ExpandAllForProjectEntryResponse, Foreground),
237    (Follow, Foreground),
238    (FollowResponse, Foreground),
239    (ApplyCodeActionKind, Foreground),
240    (ApplyCodeActionKindResponse, Foreground),
241    (FormatBuffers, Foreground),
242    (FormatBuffersResponse, Foreground),
243    (FuzzySearchUsers, Foreground),
244    (GetCachedEmbeddings, Background),
245    (GetCachedEmbeddingsResponse, Background),
246    (GetChannelMembers, Foreground),
247    (GetChannelMembersResponse, Foreground),
248    (GetChannelMessages, Background),
249    (GetChannelMessagesById, Background),
250    (GetChannelMessagesResponse, Background),
251    (GetCodeActions, Background),
252    (GetCodeActionsResponse, Background),
253    (GetCompletions, Background),
254    (GetCompletionsResponse, Background),
255    (GetDefinition, Background),
256    (GetDefinitionResponse, Background),
257    (GetDeclaration, Background),
258    (GetDeclarationResponse, Background),
259    (GetDocumentHighlights, Background),
260    (GetDocumentHighlightsResponse, Background),
261    (GetHover, Background),
262    (GetHoverResponse, Background),
263    (GetNotifications, Foreground),
264    (GetNotificationsResponse, Foreground),
265    (GetPrivateUserInfo, Foreground),
266    (GetPrivateUserInfoResponse, Foreground),
267    (GetProjectSymbols, Background),
268    (GetProjectSymbolsResponse, Background),
269    (GetReferences, Background),
270    (GetReferencesResponse, Background),
271    (GetSignatureHelp, Background),
272    (GetSignatureHelpResponse, Background),
273    (GetSupermavenApiKey, Background),
274    (GetSupermavenApiKeyResponse, Background),
275    (GetTypeDefinition, Background),
276    (GetTypeDefinitionResponse, Background),
277    (GetImplementation, Background),
278    (GetImplementationResponse, Background),
279    (GetLlmToken, Background),
280    (GetLlmTokenResponse, Background),
281    (OpenUnstagedDiff, Foreground),
282    (OpenUnstagedDiffResponse, Foreground),
283    (OpenUncommittedDiff, Foreground),
284    (OpenUncommittedDiffResponse, Foreground),
285    (GetUsers, Foreground),
286    (Hello, Foreground),
287    (IncomingCall, Foreground),
288    (InlayHints, Background),
289    (InlayHintsResponse, Background),
290    (InviteChannelMember, Foreground),
291    (JoinChannel, Foreground),
292    (JoinChannelBuffer, Foreground),
293    (JoinChannelBufferResponse, Foreground),
294    (JoinChannelChat, Foreground),
295    (JoinChannelChatResponse, Foreground),
296    (JoinProject, Foreground),
297    (JoinProjectResponse, Foreground),
298    (JoinRoom, Foreground),
299    (JoinRoomResponse, Foreground),
300    (LeaveChannelBuffer, Background),
301    (LeaveChannelChat, Foreground),
302    (LeaveProject, Foreground),
303    (LeaveRoom, Foreground),
304    (MarkNotificationRead, Foreground),
305    (MoveChannel, Foreground),
306    (OnTypeFormatting, Background),
307    (OnTypeFormattingResponse, Background),
308    (OpenBufferById, Background),
309    (OpenBufferByPath, Background),
310    (OpenBufferForSymbol, Background),
311    (OpenBufferForSymbolResponse, Background),
312    (OpenBufferResponse, Background),
313    (OpenCommitMessageBuffer, Background),
314    (PerformRename, Background),
315    (PerformRenameResponse, Background),
316    (Ping, Foreground),
317    (PrepareRename, Background),
318    (PrepareRenameResponse, Background),
319    (ProjectEntryResponse, Foreground),
320    (CountLanguageModelTokens, Background),
321    (CountLanguageModelTokensResponse, Background),
322    (RefreshLlmToken, Background),
323    (RefreshInlayHints, Foreground),
324    (RejoinChannelBuffers, Foreground),
325    (RejoinChannelBuffersResponse, Foreground),
326    (RejoinRoom, Foreground),
327    (RejoinRoomResponse, Foreground),
328    (ReloadBuffers, Foreground),
329    (ReloadBuffersResponse, Foreground),
330    (RemoveChannelMember, Foreground),
331    (RemoveChannelMessage, Foreground),
332    (UpdateChannelMessage, Foreground),
333    (RemoveContact, Foreground),
334    (RemoveProjectCollaborator, Foreground),
335    (RenameChannel, Foreground),
336    (RenameChannelResponse, Foreground),
337    (RenameProjectEntry, Foreground),
338    (RequestContact, Foreground),
339    (ResolveCompletionDocumentation, Background),
340    (ResolveCompletionDocumentationResponse, Background),
341    (ResolveInlayHint, Background),
342    (ResolveInlayHintResponse, Background),
343    (RespondToChannelInvite, Foreground),
344    (RespondToContactRequest, Foreground),
345    (RoomUpdated, Foreground),
346    (SaveBuffer, Foreground),
347    (SetChannelMemberRole, Foreground),
348    (SetChannelVisibility, Foreground),
349    (SendChannelMessage, Background),
350    (SendChannelMessageResponse, Background),
351    (ShareProject, Foreground),
352    (ShareProjectResponse, Foreground),
353    (ShowContacts, Foreground),
354    (Stage, Background),
355    (StartLanguageServer, Foreground),
356    (SubscribeToChannels, Foreground),
357    (SynchronizeBuffers, Foreground),
358    (SynchronizeBuffersResponse, Foreground),
359    (TaskContextForLocation, Background),
360    (TaskContext, Background),
361    (Test, Foreground),
362    (Unfollow, Foreground),
363    (UnshareProject, Foreground),
364    (Unstage, Background),
365    (UpdateBuffer, Foreground),
366    (UpdateBufferFile, Foreground),
367    (UpdateChannelBuffer, Foreground),
368    (UpdateChannelBufferCollaborators, Foreground),
369    (UpdateChannels, Foreground),
370    (UpdateUserChannels, Foreground),
371    (UpdateContacts, Foreground),
372    (UpdateDiagnosticSummary, Foreground),
373    (UpdateDiffBases, Foreground),
374    (UpdateFollowers, Foreground),
375    (UpdateInviteInfo, Foreground),
376    (UpdateLanguageServer, Foreground),
377    (UpdateParticipantLocation, Foreground),
378    (UpdateProject, Foreground),
379    (UpdateProjectCollaborator, Foreground),
380    (UpdateUserPlan, Foreground),
381    (UpdateWorktree, Foreground),
382    (UpdateWorktreeSettings, Foreground),
383    (UsersResponse, Foreground),
384    (LspExtExpandMacro, Background),
385    (LspExtExpandMacroResponse, Background),
386    (LspExtOpenDocs, Background),
387    (LspExtOpenDocsResponse, Background),
388    (SetRoomParticipantRole, Foreground),
389    (BlameBuffer, Foreground),
390    (BlameBufferResponse, Foreground),
391    (RejoinRemoteProjects, Foreground),
392    (RejoinRemoteProjectsResponse, Foreground),
393    (MultiLspQuery, Background),
394    (MultiLspQueryResponse, Background),
395    (ListRemoteDirectory, Background),
396    (ListRemoteDirectoryResponse, Background),
397    (OpenNewBuffer, Foreground),
398    (RestartLanguageServers, Foreground),
399    (LinkedEditingRange, Background),
400    (LinkedEditingRangeResponse, Background),
401    (AdvertiseContexts, Foreground),
402    (OpenContext, Foreground),
403    (OpenContextResponse, Foreground),
404    (CreateContext, Foreground),
405    (CreateContextResponse, Foreground),
406    (UpdateContext, Foreground),
407    (SynchronizeContexts, Foreground),
408    (SynchronizeContextsResponse, Foreground),
409    (LspExtSwitchSourceHeader, Background),
410    (LspExtSwitchSourceHeaderResponse, Background),
411    (AddWorktree, Foreground),
412    (AddWorktreeResponse, Foreground),
413    (FindSearchCandidates, Background),
414    (FindSearchCandidatesResponse, Background),
415    (CloseBuffer, Foreground),
416    (ShutdownRemoteServer, Foreground),
417    (RemoveWorktree, Foreground),
418    (LanguageServerLog, Foreground),
419    (Toast, Background),
420    (HideToast, Background),
421    (OpenServerSettings, Foreground),
422    (GetPermalinkToLine, Foreground),
423    (GetPermalinkToLineResponse, Foreground),
424    (FlushBufferedMessages, Foreground),
425    (LanguageServerPromptRequest, Foreground),
426    (LanguageServerPromptResponse, Foreground),
427    (GitGetBranches, Background),
428    (GitBranchesResponse, Background),
429    (UpdateGitBranch, Background),
430    (ListToolchains, Foreground),
431    (ListToolchainsResponse, Foreground),
432    (ActivateToolchain, Foreground),
433    (ActiveToolchain, Foreground),
434    (ActiveToolchainResponse, Foreground),
435    (GetPathMetadata, Background),
436    (GetPathMetadataResponse, Background),
437    (GetPanicFiles, Background),
438    (GetPanicFilesResponse, Background),
439    (CancelLanguageServerWork, Foreground),
440    (SyncExtensions, Background),
441    (SyncExtensionsResponse, Background),
442    (InstallExtension, Background),
443    (RegisterBufferWithLanguageServers, Background),
444    (GitReset, Background),
445    (GitCheckoutFiles, Background),
446    (GitShow, Background),
447    (GitCommitDetails, Background),
448    (SetIndexText, Background),
449    (Push, Background),
450    (Fetch, Background),
451    (GetRemotes, Background),
452    (GetRemotesResponse, Background),
453    (Pull, Background),
454    (RemoteMessageResponse, Background),
455    (GitCreateBranch, Background),
456    (GitChangeBranch, Background),
457);
458
459request_messages!(
460    (AcceptTermsOfService, AcceptTermsOfServiceResponse),
461    (ApplyCodeAction, ApplyCodeActionResponse),
462    (
463        ApplyCompletionAdditionalEdits,
464        ApplyCompletionAdditionalEditsResponse
465    ),
466    (Call, Ack),
467    (CancelCall, Ack),
468    (Commit, Ack),
469    (CopyProjectEntry, ProjectEntryResponse),
470    (ComputeEmbeddings, ComputeEmbeddingsResponse),
471    (CreateChannel, CreateChannelResponse),
472    (CreateProjectEntry, ProjectEntryResponse),
473    (CreateRoom, CreateRoomResponse),
474    (DeclineCall, Ack),
475    (DeleteChannel, Ack),
476    (DeleteProjectEntry, ProjectEntryResponse),
477    (ExpandProjectEntry, ExpandProjectEntryResponse),
478    (ExpandAllForProjectEntry, ExpandAllForProjectEntryResponse),
479    (Follow, FollowResponse),
480    (ApplyCodeActionKind, ApplyCodeActionKindResponse),
481    (FormatBuffers, FormatBuffersResponse),
482    (FuzzySearchUsers, UsersResponse),
483    (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
484    (GetChannelMembers, GetChannelMembersResponse),
485    (GetChannelMessages, GetChannelMessagesResponse),
486    (GetChannelMessagesById, GetChannelMessagesResponse),
487    (GetCodeActions, GetCodeActionsResponse),
488    (GetCompletions, GetCompletionsResponse),
489    (GetDefinition, GetDefinitionResponse),
490    (GetDeclaration, GetDeclarationResponse),
491    (GetImplementation, GetImplementationResponse),
492    (GetDocumentHighlights, GetDocumentHighlightsResponse),
493    (GetHover, GetHoverResponse),
494    (GetLlmToken, GetLlmTokenResponse),
495    (GetNotifications, GetNotificationsResponse),
496    (GetPrivateUserInfo, GetPrivateUserInfoResponse),
497    (GetProjectSymbols, GetProjectSymbolsResponse),
498    (GetReferences, GetReferencesResponse),
499    (GetSignatureHelp, GetSignatureHelpResponse),
500    (OpenUnstagedDiff, OpenUnstagedDiffResponse),
501    (OpenUncommittedDiff, OpenUncommittedDiffResponse),
502    (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
503    (GetTypeDefinition, GetTypeDefinitionResponse),
504    (LinkedEditingRange, LinkedEditingRangeResponse),
505    (ListRemoteDirectory, ListRemoteDirectoryResponse),
506    (GetUsers, UsersResponse),
507    (IncomingCall, Ack),
508    (InlayHints, InlayHintsResponse),
509    (InviteChannelMember, Ack),
510    (JoinChannel, JoinRoomResponse),
511    (JoinChannelBuffer, JoinChannelBufferResponse),
512    (JoinChannelChat, JoinChannelChatResponse),
513    (JoinProject, JoinProjectResponse),
514    (JoinRoom, JoinRoomResponse),
515    (LeaveChannelBuffer, Ack),
516    (LeaveRoom, Ack),
517    (MarkNotificationRead, Ack),
518    (MoveChannel, Ack),
519    (OnTypeFormatting, OnTypeFormattingResponse),
520    (OpenBufferById, OpenBufferResponse),
521    (OpenBufferByPath, OpenBufferResponse),
522    (OpenBufferForSymbol, OpenBufferForSymbolResponse),
523    (OpenCommitMessageBuffer, OpenBufferResponse),
524    (OpenNewBuffer, OpenBufferResponse),
525    (PerformRename, PerformRenameResponse),
526    (Ping, Ack),
527    (PrepareRename, PrepareRenameResponse),
528    (CountLanguageModelTokens, CountLanguageModelTokensResponse),
529    (RefreshInlayHints, Ack),
530    (RejoinChannelBuffers, RejoinChannelBuffersResponse),
531    (RejoinRoom, RejoinRoomResponse),
532    (ReloadBuffers, ReloadBuffersResponse),
533    (RemoveChannelMember, Ack),
534    (RemoveChannelMessage, Ack),
535    (UpdateChannelMessage, Ack),
536    (RemoveContact, Ack),
537    (RenameChannel, RenameChannelResponse),
538    (RenameProjectEntry, ProjectEntryResponse),
539    (RequestContact, Ack),
540    (
541        ResolveCompletionDocumentation,
542        ResolveCompletionDocumentationResponse
543    ),
544    (ResolveInlayHint, ResolveInlayHintResponse),
545    (RespondToChannelInvite, Ack),
546    (RespondToContactRequest, Ack),
547    (SaveBuffer, BufferSaved),
548    (Stage, Ack),
549    (FindSearchCandidates, FindSearchCandidatesResponse),
550    (SendChannelMessage, SendChannelMessageResponse),
551    (SetChannelMemberRole, Ack),
552    (SetChannelVisibility, Ack),
553    (ShareProject, ShareProjectResponse),
554    (SynchronizeBuffers, SynchronizeBuffersResponse),
555    (TaskContextForLocation, TaskContext),
556    (Test, Test),
557    (Unstage, Ack),
558    (UpdateBuffer, Ack),
559    (UpdateParticipantLocation, Ack),
560    (UpdateProject, Ack),
561    (UpdateWorktree, Ack),
562    (LspExtExpandMacro, LspExtExpandMacroResponse),
563    (LspExtOpenDocs, LspExtOpenDocsResponse),
564    (SetRoomParticipantRole, Ack),
565    (BlameBuffer, BlameBufferResponse),
566    (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
567    (MultiLspQuery, MultiLspQueryResponse),
568    (RestartLanguageServers, Ack),
569    (OpenContext, OpenContextResponse),
570    (CreateContext, CreateContextResponse),
571    (SynchronizeContexts, SynchronizeContextsResponse),
572    (LspExtSwitchSourceHeader, LspExtSwitchSourceHeaderResponse),
573    (AddWorktree, AddWorktreeResponse),
574    (ShutdownRemoteServer, Ack),
575    (RemoveWorktree, Ack),
576    (OpenServerSettings, OpenBufferResponse),
577    (GetPermalinkToLine, GetPermalinkToLineResponse),
578    (FlushBufferedMessages, Ack),
579    (LanguageServerPromptRequest, LanguageServerPromptResponse),
580    (GitGetBranches, GitBranchesResponse),
581    (UpdateGitBranch, Ack),
582    (ListToolchains, ListToolchainsResponse),
583    (ActivateToolchain, Ack),
584    (ActiveToolchain, ActiveToolchainResponse),
585    (GetPathMetadata, GetPathMetadataResponse),
586    (GetPanicFiles, GetPanicFilesResponse),
587    (CancelLanguageServerWork, Ack),
588    (SyncExtensions, SyncExtensionsResponse),
589    (InstallExtension, Ack),
590    (RegisterBufferWithLanguageServers, Ack),
591    (GitShow, GitCommitDetails),
592    (GitReset, Ack),
593    (GitCheckoutFiles, Ack),
594    (SetIndexText, Ack),
595    (Push, RemoteMessageResponse),
596    (Fetch, RemoteMessageResponse),
597    (GetRemotes, GetRemotesResponse),
598    (Pull, RemoteMessageResponse),
599    (GitCreateBranch, Ack),
600    (GitChangeBranch, Ack),
601);
602
603entity_messages!(
604    {project_id, ShareProject},
605    AddProjectCollaborator,
606    AddWorktree,
607    ApplyCodeAction,
608    ApplyCompletionAdditionalEdits,
609    BlameBuffer,
610    BufferReloaded,
611    BufferSaved,
612    CloseBuffer,
613    Commit,
614    CopyProjectEntry,
615    CreateBufferForPeer,
616    CreateProjectEntry,
617    DeleteProjectEntry,
618    ExpandProjectEntry,
619    ExpandAllForProjectEntry,
620    FindSearchCandidates,
621    ApplyCodeActionKind,
622    FormatBuffers,
623    GetCodeActions,
624    GetCompletions,
625    GetDefinition,
626    GetDeclaration,
627    GetImplementation,
628    GetDocumentHighlights,
629    GetHover,
630    GetProjectSymbols,
631    GetReferences,
632    GetSignatureHelp,
633    OpenUnstagedDiff,
634    OpenUncommittedDiff,
635    GetTypeDefinition,
636    InlayHints,
637    JoinProject,
638    LeaveProject,
639    LinkedEditingRange,
640    MultiLspQuery,
641    RestartLanguageServers,
642    OnTypeFormatting,
643    OpenNewBuffer,
644    OpenBufferById,
645    OpenBufferByPath,
646    OpenBufferForSymbol,
647    OpenCommitMessageBuffer,
648    PerformRename,
649    PrepareRename,
650    RefreshInlayHints,
651    ReloadBuffers,
652    RemoveProjectCollaborator,
653    RenameProjectEntry,
654    ResolveCompletionDocumentation,
655    ResolveInlayHint,
656    SaveBuffer,
657    Stage,
658    StartLanguageServer,
659    SynchronizeBuffers,
660    TaskContextForLocation,
661    UnshareProject,
662    Unstage,
663    UpdateBuffer,
664    UpdateBufferFile,
665    UpdateDiagnosticSummary,
666    UpdateDiffBases,
667    UpdateLanguageServer,
668    UpdateProject,
669    UpdateProjectCollaborator,
670    UpdateWorktree,
671    UpdateWorktreeSettings,
672    LspExtExpandMacro,
673    LspExtOpenDocs,
674    AdvertiseContexts,
675    OpenContext,
676    CreateContext,
677    UpdateContext,
678    SynchronizeContexts,
679    LspExtSwitchSourceHeader,
680    LanguageServerLog,
681    Toast,
682    HideToast,
683    OpenServerSettings,
684    GetPermalinkToLine,
685    LanguageServerPromptRequest,
686    GitGetBranches,
687    UpdateGitBranch,
688    ListToolchains,
689    ActivateToolchain,
690    ActiveToolchain,
691    GetPathMetadata,
692    CancelLanguageServerWork,
693    RegisterBufferWithLanguageServers,
694    GitShow,
695    GitReset,
696    GitCheckoutFiles,
697    SetIndexText,
698    Push,
699    Fetch,
700    GetRemotes,
701    Pull,
702    GitChangeBranch,
703    GitCreateBranch,
704);
705
706entity_messages!(
707    {channel_id, Channel},
708    ChannelMessageSent,
709    ChannelMessageUpdate,
710    RemoveChannelMessage,
711    UpdateChannelMessage,
712    UpdateChannelBuffer,
713    UpdateChannelBufferCollaborators,
714);
715
716impl From<Timestamp> for SystemTime {
717    fn from(val: Timestamp) -> Self {
718        UNIX_EPOCH
719            .checked_add(Duration::new(val.seconds, val.nanos))
720            .unwrap()
721    }
722}
723
724impl From<SystemTime> for Timestamp {
725    fn from(time: SystemTime) -> Self {
726        let duration = time.duration_since(UNIX_EPOCH).unwrap();
727        Self {
728            seconds: duration.as_secs(),
729            nanos: duration.subsec_nanos(),
730        }
731    }
732}
733
734impl From<u128> for Nonce {
735    fn from(nonce: u128) -> Self {
736        let upper_half = (nonce >> 64) as u64;
737        let lower_half = nonce as u64;
738        Self {
739            upper_half,
740            lower_half,
741        }
742    }
743}
744
745impl From<Nonce> for u128 {
746    fn from(nonce: Nonce) -> Self {
747        let upper_half = (nonce.upper_half as u128) << 64;
748        let lower_half = nonce.lower_half as u128;
749        upper_half | lower_half
750    }
751}
752
753#[cfg(any(test, feature = "test-support"))]
754pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 2;
755#[cfg(not(any(test, feature = "test-support")))]
756pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 256;
757
758pub fn split_worktree_update(mut message: UpdateWorktree) -> impl Iterator<Item = UpdateWorktree> {
759    let mut done = false;
760
761    iter::from_fn(move || {
762        if done {
763            return None;
764        }
765
766        let updated_entries_chunk_size = cmp::min(
767            message.updated_entries.len(),
768            MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
769        );
770        let updated_entries: Vec<_> = message
771            .updated_entries
772            .drain(..updated_entries_chunk_size)
773            .collect();
774
775        let removed_entries_chunk_size = cmp::min(
776            message.removed_entries.len(),
777            MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
778        );
779        let removed_entries = message
780            .removed_entries
781            .drain(..removed_entries_chunk_size)
782            .collect();
783
784        let mut updated_repositories = Vec::new();
785        let mut limit = MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE;
786        while let Some(repo) = message.updated_repositories.first_mut() {
787            let updated_statuses_limit = cmp::min(repo.updated_statuses.len(), limit);
788            let removed_statuses_limit = cmp::min(repo.removed_statuses.len(), limit);
789
790            updated_repositories.push(RepositoryEntry {
791                work_directory_id: repo.work_directory_id,
792                branch: repo.branch.clone(),
793                branch_summary: repo.branch_summary.clone(),
794                updated_statuses: repo
795                    .updated_statuses
796                    .drain(..updated_statuses_limit)
797                    .collect(),
798                removed_statuses: repo
799                    .removed_statuses
800                    .drain(..removed_statuses_limit)
801                    .collect(),
802                current_merge_conflicts: repo.current_merge_conflicts.clone(),
803            });
804            if repo.removed_statuses.is_empty() && repo.updated_statuses.is_empty() {
805                message.updated_repositories.remove(0);
806            }
807            limit = limit.saturating_sub(removed_statuses_limit + updated_statuses_limit);
808            if limit == 0 {
809                break;
810            }
811        }
812
813        done = message.updated_entries.is_empty()
814            && message.removed_entries.is_empty()
815            && message.updated_repositories.is_empty();
816
817        let removed_repositories = if done {
818            mem::take(&mut message.removed_repositories)
819        } else {
820            Default::default()
821        };
822
823        Some(UpdateWorktree {
824            project_id: message.project_id,
825            worktree_id: message.worktree_id,
826            root_name: message.root_name.clone(),
827            abs_path: message.abs_path.clone(),
828            updated_entries,
829            removed_entries,
830            scan_id: message.scan_id,
831            is_last_update: done && message.is_last_update,
832            updated_repositories,
833            removed_repositories,
834        })
835    })
836}
837
838#[cfg(test)]
839mod tests {
840    use super::*;
841
842    #[test]
843    fn test_converting_peer_id_from_and_to_u64() {
844        let peer_id = PeerId {
845            owner_id: 10,
846            id: 3,
847        };
848        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
849        let peer_id = PeerId {
850            owner_id: u32::MAX,
851            id: 3,
852        };
853        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
854        let peer_id = PeerId {
855            owner_id: 10,
856            id: u32::MAX,
857        };
858        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
859        let peer_id = PeerId {
860            owner_id: u32::MAX,
861            id: u32::MAX,
862        };
863        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
864    }
865
866    #[test]
867    #[cfg(target_os = "windows")]
868    fn test_proto() {
869        fn generate_proto_path(path: PathBuf) -> PathBuf {
870            let proto = path.to_proto();
871            PathBuf::from_proto(proto)
872        }
873
874        let path = PathBuf::from("C:\\foo\\bar");
875        assert_eq!(path, generate_proto_path(path.clone()));
876
877        let path = PathBuf::from("C:/foo/bar/");
878        assert_eq!(path, generate_proto_path(path.clone()));
879
880        let path = PathBuf::from("C:/foo\\bar\\");
881        assert_eq!(path, generate_proto_path(path.clone()));
882    }
883}