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}