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}