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    (AskPassRequest, Background),
456    (AskPassResponse, Background),
457    (GitCreateBranch, Background),
458    (GitChangeBranch, Background),
459    (CheckForPushedCommits, Background),
460    (CheckForPushedCommitsResponse, Background),
461);
462
463request_messages!(
464    (AcceptTermsOfService, AcceptTermsOfServiceResponse),
465    (ApplyCodeAction, ApplyCodeActionResponse),
466    (
467        ApplyCompletionAdditionalEdits,
468        ApplyCompletionAdditionalEditsResponse
469    ),
470    (Call, Ack),
471    (CancelCall, Ack),
472    (Commit, Ack),
473    (CopyProjectEntry, ProjectEntryResponse),
474    (ComputeEmbeddings, ComputeEmbeddingsResponse),
475    (CreateChannel, CreateChannelResponse),
476    (CreateProjectEntry, ProjectEntryResponse),
477    (CreateRoom, CreateRoomResponse),
478    (DeclineCall, Ack),
479    (DeleteChannel, Ack),
480    (DeleteProjectEntry, ProjectEntryResponse),
481    (ExpandProjectEntry, ExpandProjectEntryResponse),
482    (ExpandAllForProjectEntry, ExpandAllForProjectEntryResponse),
483    (Follow, FollowResponse),
484    (ApplyCodeActionKind, ApplyCodeActionKindResponse),
485    (FormatBuffers, FormatBuffersResponse),
486    (FuzzySearchUsers, UsersResponse),
487    (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
488    (GetChannelMembers, GetChannelMembersResponse),
489    (GetChannelMessages, GetChannelMessagesResponse),
490    (GetChannelMessagesById, GetChannelMessagesResponse),
491    (GetCodeActions, GetCodeActionsResponse),
492    (GetCompletions, GetCompletionsResponse),
493    (GetDefinition, GetDefinitionResponse),
494    (GetDeclaration, GetDeclarationResponse),
495    (GetImplementation, GetImplementationResponse),
496    (GetDocumentHighlights, GetDocumentHighlightsResponse),
497    (GetHover, GetHoverResponse),
498    (GetLlmToken, GetLlmTokenResponse),
499    (GetNotifications, GetNotificationsResponse),
500    (GetPrivateUserInfo, GetPrivateUserInfoResponse),
501    (GetProjectSymbols, GetProjectSymbolsResponse),
502    (GetReferences, GetReferencesResponse),
503    (GetSignatureHelp, GetSignatureHelpResponse),
504    (OpenUnstagedDiff, OpenUnstagedDiffResponse),
505    (OpenUncommittedDiff, OpenUncommittedDiffResponse),
506    (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
507    (GetTypeDefinition, GetTypeDefinitionResponse),
508    (LinkedEditingRange, LinkedEditingRangeResponse),
509    (ListRemoteDirectory, ListRemoteDirectoryResponse),
510    (GetUsers, UsersResponse),
511    (IncomingCall, Ack),
512    (InlayHints, InlayHintsResponse),
513    (InviteChannelMember, Ack),
514    (JoinChannel, JoinRoomResponse),
515    (JoinChannelBuffer, JoinChannelBufferResponse),
516    (JoinChannelChat, JoinChannelChatResponse),
517    (JoinProject, JoinProjectResponse),
518    (JoinRoom, JoinRoomResponse),
519    (LeaveChannelBuffer, Ack),
520    (LeaveRoom, Ack),
521    (MarkNotificationRead, Ack),
522    (MoveChannel, Ack),
523    (OnTypeFormatting, OnTypeFormattingResponse),
524    (OpenBufferById, OpenBufferResponse),
525    (OpenBufferByPath, OpenBufferResponse),
526    (OpenBufferForSymbol, OpenBufferForSymbolResponse),
527    (OpenCommitMessageBuffer, OpenBufferResponse),
528    (OpenNewBuffer, OpenBufferResponse),
529    (PerformRename, PerformRenameResponse),
530    (Ping, Ack),
531    (PrepareRename, PrepareRenameResponse),
532    (CountLanguageModelTokens, CountLanguageModelTokensResponse),
533    (RefreshInlayHints, Ack),
534    (RejoinChannelBuffers, RejoinChannelBuffersResponse),
535    (RejoinRoom, RejoinRoomResponse),
536    (ReloadBuffers, ReloadBuffersResponse),
537    (RemoveChannelMember, Ack),
538    (RemoveChannelMessage, Ack),
539    (UpdateChannelMessage, Ack),
540    (RemoveContact, Ack),
541    (RenameChannel, RenameChannelResponse),
542    (RenameProjectEntry, ProjectEntryResponse),
543    (RequestContact, Ack),
544    (
545        ResolveCompletionDocumentation,
546        ResolveCompletionDocumentationResponse
547    ),
548    (ResolveInlayHint, ResolveInlayHintResponse),
549    (RespondToChannelInvite, Ack),
550    (RespondToContactRequest, Ack),
551    (SaveBuffer, BufferSaved),
552    (Stage, Ack),
553    (FindSearchCandidates, FindSearchCandidatesResponse),
554    (SendChannelMessage, SendChannelMessageResponse),
555    (SetChannelMemberRole, Ack),
556    (SetChannelVisibility, Ack),
557    (ShareProject, ShareProjectResponse),
558    (SynchronizeBuffers, SynchronizeBuffersResponse),
559    (TaskContextForLocation, TaskContext),
560    (Test, Test),
561    (Unstage, Ack),
562    (UpdateBuffer, Ack),
563    (UpdateParticipantLocation, Ack),
564    (UpdateProject, Ack),
565    (UpdateWorktree, Ack),
566    (LspExtExpandMacro, LspExtExpandMacroResponse),
567    (LspExtOpenDocs, LspExtOpenDocsResponse),
568    (SetRoomParticipantRole, Ack),
569    (BlameBuffer, BlameBufferResponse),
570    (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
571    (MultiLspQuery, MultiLspQueryResponse),
572    (RestartLanguageServers, Ack),
573    (OpenContext, OpenContextResponse),
574    (CreateContext, CreateContextResponse),
575    (SynchronizeContexts, SynchronizeContextsResponse),
576    (LspExtSwitchSourceHeader, LspExtSwitchSourceHeaderResponse),
577    (AddWorktree, AddWorktreeResponse),
578    (ShutdownRemoteServer, Ack),
579    (RemoveWorktree, Ack),
580    (OpenServerSettings, OpenBufferResponse),
581    (GetPermalinkToLine, GetPermalinkToLineResponse),
582    (FlushBufferedMessages, Ack),
583    (LanguageServerPromptRequest, LanguageServerPromptResponse),
584    (GitGetBranches, GitBranchesResponse),
585    (UpdateGitBranch, Ack),
586    (ListToolchains, ListToolchainsResponse),
587    (ActivateToolchain, Ack),
588    (ActiveToolchain, ActiveToolchainResponse),
589    (GetPathMetadata, GetPathMetadataResponse),
590    (GetPanicFiles, GetPanicFilesResponse),
591    (CancelLanguageServerWork, Ack),
592    (SyncExtensions, SyncExtensionsResponse),
593    (InstallExtension, Ack),
594    (RegisterBufferWithLanguageServers, Ack),
595    (GitShow, GitCommitDetails),
596    (GitReset, Ack),
597    (GitCheckoutFiles, Ack),
598    (SetIndexText, Ack),
599    (Push, RemoteMessageResponse),
600    (Fetch, RemoteMessageResponse),
601    (GetRemotes, GetRemotesResponse),
602    (Pull, RemoteMessageResponse),
603    (AskPassRequest, AskPassResponse),
604    (GitCreateBranch, Ack),
605    (GitChangeBranch, Ack),
606    (CheckForPushedCommits, CheckForPushedCommitsResponse),
607);
608
609entity_messages!(
610    {project_id, ShareProject},
611    AddProjectCollaborator,
612    AddWorktree,
613    ApplyCodeAction,
614    ApplyCompletionAdditionalEdits,
615    BlameBuffer,
616    BufferReloaded,
617    BufferSaved,
618    CloseBuffer,
619    Commit,
620    CopyProjectEntry,
621    CreateBufferForPeer,
622    CreateProjectEntry,
623    DeleteProjectEntry,
624    ExpandProjectEntry,
625    ExpandAllForProjectEntry,
626    FindSearchCandidates,
627    ApplyCodeActionKind,
628    FormatBuffers,
629    GetCodeActions,
630    GetCompletions,
631    GetDefinition,
632    GetDeclaration,
633    GetImplementation,
634    GetDocumentHighlights,
635    GetHover,
636    GetProjectSymbols,
637    GetReferences,
638    GetSignatureHelp,
639    OpenUnstagedDiff,
640    OpenUncommittedDiff,
641    GetTypeDefinition,
642    InlayHints,
643    JoinProject,
644    LeaveProject,
645    LinkedEditingRange,
646    MultiLspQuery,
647    RestartLanguageServers,
648    OnTypeFormatting,
649    OpenNewBuffer,
650    OpenBufferById,
651    OpenBufferByPath,
652    OpenBufferForSymbol,
653    OpenCommitMessageBuffer,
654    PerformRename,
655    PrepareRename,
656    RefreshInlayHints,
657    ReloadBuffers,
658    RemoveProjectCollaborator,
659    RenameProjectEntry,
660    ResolveCompletionDocumentation,
661    ResolveInlayHint,
662    SaveBuffer,
663    Stage,
664    StartLanguageServer,
665    SynchronizeBuffers,
666    TaskContextForLocation,
667    UnshareProject,
668    Unstage,
669    UpdateBuffer,
670    UpdateBufferFile,
671    UpdateDiagnosticSummary,
672    UpdateDiffBases,
673    UpdateLanguageServer,
674    UpdateProject,
675    UpdateProjectCollaborator,
676    UpdateWorktree,
677    UpdateWorktreeSettings,
678    LspExtExpandMacro,
679    LspExtOpenDocs,
680    AdvertiseContexts,
681    OpenContext,
682    CreateContext,
683    UpdateContext,
684    SynchronizeContexts,
685    LspExtSwitchSourceHeader,
686    LanguageServerLog,
687    Toast,
688    HideToast,
689    OpenServerSettings,
690    GetPermalinkToLine,
691    LanguageServerPromptRequest,
692    GitGetBranches,
693    UpdateGitBranch,
694    ListToolchains,
695    ActivateToolchain,
696    ActiveToolchain,
697    GetPathMetadata,
698    CancelLanguageServerWork,
699    RegisterBufferWithLanguageServers,
700    GitShow,
701    GitReset,
702    GitCheckoutFiles,
703    SetIndexText,
704    Push,
705    Fetch,
706    GetRemotes,
707    Pull,
708    AskPassRequest,
709    GitChangeBranch,
710    GitCreateBranch,
711    CheckForPushedCommits,
712);
713
714entity_messages!(
715    {channel_id, Channel},
716    ChannelMessageSent,
717    ChannelMessageUpdate,
718    RemoveChannelMessage,
719    UpdateChannelMessage,
720    UpdateChannelBuffer,
721    UpdateChannelBufferCollaborators,
722);
723
724impl From<Timestamp> for SystemTime {
725    fn from(val: Timestamp) -> Self {
726        UNIX_EPOCH
727            .checked_add(Duration::new(val.seconds, val.nanos))
728            .unwrap()
729    }
730}
731
732impl From<SystemTime> for Timestamp {
733    fn from(time: SystemTime) -> Self {
734        let duration = time.duration_since(UNIX_EPOCH).unwrap();
735        Self {
736            seconds: duration.as_secs(),
737            nanos: duration.subsec_nanos(),
738        }
739    }
740}
741
742impl From<u128> for Nonce {
743    fn from(nonce: u128) -> Self {
744        let upper_half = (nonce >> 64) as u64;
745        let lower_half = nonce as u64;
746        Self {
747            upper_half,
748            lower_half,
749        }
750    }
751}
752
753impl From<Nonce> for u128 {
754    fn from(nonce: Nonce) -> Self {
755        let upper_half = (nonce.upper_half as u128) << 64;
756        let lower_half = nonce.lower_half as u128;
757        upper_half | lower_half
758    }
759}
760
761#[cfg(any(test, feature = "test-support"))]
762pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 2;
763#[cfg(not(any(test, feature = "test-support")))]
764pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 256;
765
766pub fn split_worktree_update(mut message: UpdateWorktree) -> impl Iterator<Item = UpdateWorktree> {
767    let mut done = false;
768
769    iter::from_fn(move || {
770        if done {
771            return None;
772        }
773
774        let updated_entries_chunk_size = cmp::min(
775            message.updated_entries.len(),
776            MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
777        );
778        let updated_entries: Vec<_> = message
779            .updated_entries
780            .drain(..updated_entries_chunk_size)
781            .collect();
782
783        let removed_entries_chunk_size = cmp::min(
784            message.removed_entries.len(),
785            MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
786        );
787        let removed_entries = message
788            .removed_entries
789            .drain(..removed_entries_chunk_size)
790            .collect();
791
792        let mut updated_repositories = Vec::new();
793        let mut limit = MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE;
794        while let Some(repo) = message.updated_repositories.first_mut() {
795            let updated_statuses_limit = cmp::min(repo.updated_statuses.len(), limit);
796            let removed_statuses_limit = cmp::min(repo.removed_statuses.len(), limit);
797
798            updated_repositories.push(RepositoryEntry {
799                work_directory_id: repo.work_directory_id,
800                branch: repo.branch.clone(),
801                branch_summary: repo.branch_summary.clone(),
802                updated_statuses: repo
803                    .updated_statuses
804                    .drain(..updated_statuses_limit)
805                    .collect(),
806                removed_statuses: repo
807                    .removed_statuses
808                    .drain(..removed_statuses_limit)
809                    .collect(),
810                current_merge_conflicts: repo.current_merge_conflicts.clone(),
811            });
812            if repo.removed_statuses.is_empty() && repo.updated_statuses.is_empty() {
813                message.updated_repositories.remove(0);
814            }
815            limit = limit.saturating_sub(removed_statuses_limit + updated_statuses_limit);
816            if limit == 0 {
817                break;
818            }
819        }
820
821        done = message.updated_entries.is_empty()
822            && message.removed_entries.is_empty()
823            && message.updated_repositories.is_empty();
824
825        let removed_repositories = if done {
826            mem::take(&mut message.removed_repositories)
827        } else {
828            Default::default()
829        };
830
831        Some(UpdateWorktree {
832            project_id: message.project_id,
833            worktree_id: message.worktree_id,
834            root_name: message.root_name.clone(),
835            abs_path: message.abs_path.clone(),
836            updated_entries,
837            removed_entries,
838            scan_id: message.scan_id,
839            is_last_update: done && message.is_last_update,
840            updated_repositories,
841            removed_repositories,
842        })
843    })
844}
845
846#[cfg(test)]
847mod tests {
848    use super::*;
849
850    #[test]
851    fn test_converting_peer_id_from_and_to_u64() {
852        let peer_id = PeerId {
853            owner_id: 10,
854            id: 3,
855        };
856        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
857        let peer_id = PeerId {
858            owner_id: u32::MAX,
859            id: 3,
860        };
861        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
862        let peer_id = PeerId {
863            owner_id: 10,
864            id: u32::MAX,
865        };
866        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
867        let peer_id = PeerId {
868            owner_id: u32::MAX,
869            id: u32::MAX,
870        };
871        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
872    }
873
874    #[test]
875    #[cfg(target_os = "windows")]
876    fn test_proto() {
877        fn generate_proto_path(path: PathBuf) -> PathBuf {
878            let proto = path.to_proto();
879            PathBuf::from_proto(proto)
880        }
881
882        let path = PathBuf::from("C:\\foo\\bar");
883        assert_eq!(path, generate_proto_path(path.clone()));
884
885        let path = PathBuf::from("C:/foo/bar/");
886        assert_eq!(path, generate_proto_path(path.clone()));
887
888        let path = PathBuf::from("C:/foo\\bar\\");
889        assert_eq!(path, generate_proto_path(path.clone()));
890    }
891}