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