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