1#![allow(non_snake_case)]
2
3pub mod error;
4mod macros;
5mod typed_envelope;
6
7pub use error::*;
8pub use typed_envelope::*;
9
10pub use prost::{DecodeError, Message};
11use serde::Serialize;
12use std::{
13 any::{Any, TypeId},
14 cmp,
15 fmt::{self, Debug},
16 iter, mem,
17 path::{Path, PathBuf},
18 sync::Arc,
19 time::{Duration, SystemTime, UNIX_EPOCH},
20};
21
22include!(concat!(env!("OUT_DIR"), "/zed.messages.rs"));
23
24pub const SSH_PEER_ID: PeerId = PeerId { owner_id: 0, id: 0 };
25pub const SSH_PROJECT_ID: u64 = 0;
26
27pub trait EnvelopedMessage: Clone + Debug + Serialize + Sized + Send + Sync + 'static {
28 const NAME: &'static str;
29 const PRIORITY: MessagePriority;
30 fn into_envelope(
31 self,
32 id: u32,
33 responding_to: Option<u32>,
34 original_sender_id: Option<PeerId>,
35 ) -> Envelope;
36 fn from_envelope(envelope: Envelope) -> Option<Self>;
37}
38
39pub trait EntityMessage: EnvelopedMessage {
40 type Entity;
41 fn remote_entity_id(&self) -> u64;
42}
43
44pub trait RequestMessage: EnvelopedMessage {
45 type Response: EnvelopedMessage;
46}
47
48pub trait AnyTypedEnvelope: 'static + Send + Sync {
49 fn payload_type_id(&self) -> TypeId;
50 fn payload_type_name(&self) -> &'static str;
51 fn as_any(&self) -> &dyn Any;
52 fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync>;
53 fn is_background(&self) -> bool;
54 fn original_sender_id(&self) -> Option<PeerId>;
55 fn sender_id(&self) -> PeerId;
56 fn message_id(&self) -> u32;
57}
58
59pub enum MessagePriority {
60 Foreground,
61 Background,
62}
63
64impl<T: EnvelopedMessage> AnyTypedEnvelope for TypedEnvelope<T> {
65 fn payload_type_id(&self) -> TypeId {
66 TypeId::of::<T>()
67 }
68
69 fn payload_type_name(&self) -> &'static str {
70 T::NAME
71 }
72
73 fn as_any(&self) -> &dyn Any {
74 self
75 }
76
77 fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync> {
78 self
79 }
80
81 fn is_background(&self) -> bool {
82 matches!(T::PRIORITY, MessagePriority::Background)
83 }
84
85 fn original_sender_id(&self) -> Option<PeerId> {
86 self.original_sender_id
87 }
88
89 fn sender_id(&self) -> PeerId {
90 self.sender_id
91 }
92
93 fn message_id(&self) -> u32 {
94 self.message_id
95 }
96}
97
98impl PeerId {
99 pub fn from_u64(peer_id: u64) -> Self {
100 let owner_id = (peer_id >> 32) as u32;
101 let id = peer_id as u32;
102 Self { owner_id, id }
103 }
104
105 pub fn as_u64(self) -> u64 {
106 ((self.owner_id as u64) << 32) | (self.id as u64)
107 }
108}
109
110impl Copy for PeerId {}
111
112impl Eq for PeerId {}
113
114impl Ord for PeerId {
115 fn cmp(&self, other: &Self) -> cmp::Ordering {
116 self.owner_id
117 .cmp(&other.owner_id)
118 .then_with(|| self.id.cmp(&other.id))
119 }
120}
121
122impl PartialOrd for PeerId {
123 fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
124 Some(self.cmp(other))
125 }
126}
127
128impl std::hash::Hash for PeerId {
129 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
130 self.owner_id.hash(state);
131 self.id.hash(state);
132 }
133}
134
135impl fmt::Display for PeerId {
136 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
137 write!(f, "{}/{}", self.owner_id, self.id)
138 }
139}
140
141pub trait FromProto {
142 fn from_proto(proto: String) -> Self;
143}
144
145pub trait ToProto {
146 fn to_proto(self) -> String;
147}
148
149impl FromProto for PathBuf {
150 #[cfg(target_os = "windows")]
151 fn from_proto(proto: String) -> Self {
152 proto.split("/").collect()
153 }
154
155 #[cfg(not(target_os = "windows"))]
156 fn from_proto(proto: String) -> Self {
157 PathBuf::from(proto)
158 }
159}
160
161impl FromProto for Arc<Path> {
162 fn from_proto(proto: String) -> Self {
163 PathBuf::from_proto(proto).into()
164 }
165}
166
167impl ToProto for PathBuf {
168 #[cfg(target_os = "windows")]
169 fn to_proto(self) -> String {
170 self.components()
171 .map(|comp| comp.as_os_str().to_string_lossy().to_string())
172 .collect::<Vec<_>>()
173 .join("/")
174 }
175
176 #[cfg(not(target_os = "windows"))]
177 fn to_proto(self) -> String {
178 self.to_string_lossy().to_string()
179 }
180}
181
182impl ToProto for &Path {
183 #[cfg(target_os = "windows")]
184 fn to_proto(self) -> String {
185 self.components()
186 .map(|comp| comp.as_os_str().to_string_lossy().to_string())
187 .collect::<Vec<_>>()
188 .join("/")
189 }
190
191 #[cfg(not(target_os = "windows"))]
192 fn to_proto(self) -> String {
193 self.to_string_lossy().to_string()
194 }
195}
196
197messages!(
198 (AcceptTermsOfService, Foreground),
199 (AcceptTermsOfServiceResponse, Foreground),
200 (Ack, Foreground),
201 (AckBufferOperation, Background),
202 (AckChannelMessage, Background),
203 (AddNotification, Foreground),
204 (AddProjectCollaborator, Foreground),
205 (ApplyCodeAction, Background),
206 (ApplyCodeActionResponse, Background),
207 (ApplyCompletionAdditionalEdits, Background),
208 (ApplyCompletionAdditionalEditsResponse, Background),
209 (BufferReloaded, Foreground),
210 (BufferSaved, Foreground),
211 (Call, Foreground),
212 (CallCanceled, Foreground),
213 (CancelCall, Foreground),
214 (ChannelMessageSent, Foreground),
215 (ChannelMessageUpdate, Foreground),
216 (Commit, Background),
217 (ComputeEmbeddings, Background),
218 (ComputeEmbeddingsResponse, Background),
219 (CopyProjectEntry, Foreground),
220 (CreateBufferForPeer, Foreground),
221 (CreateChannel, Foreground),
222 (CreateChannelResponse, Foreground),
223 (CreateProjectEntry, Foreground),
224 (CreateRoom, Foreground),
225 (CreateRoomResponse, Foreground),
226 (DeclineCall, Foreground),
227 (DeleteChannel, Foreground),
228 (DeleteNotification, Foreground),
229 (UpdateNotification, Foreground),
230 (DeleteProjectEntry, Foreground),
231 (EndStream, Foreground),
232 (Error, Foreground),
233 (ExpandProjectEntry, Foreground),
234 (ExpandProjectEntryResponse, Foreground),
235 (ExpandAllForProjectEntry, Foreground),
236 (ExpandAllForProjectEntryResponse, Foreground),
237 (Follow, Foreground),
238 (FollowResponse, Foreground),
239 (ApplyCodeActionKind, Foreground),
240 (ApplyCodeActionKindResponse, Foreground),
241 (FormatBuffers, Foreground),
242 (FormatBuffersResponse, Foreground),
243 (FuzzySearchUsers, Foreground),
244 (GetCachedEmbeddings, Background),
245 (GetCachedEmbeddingsResponse, Background),
246 (GetChannelMembers, Foreground),
247 (GetChannelMembersResponse, Foreground),
248 (GetChannelMessages, Background),
249 (GetChannelMessagesById, Background),
250 (GetChannelMessagesResponse, Background),
251 (GetCodeActions, Background),
252 (GetCodeActionsResponse, Background),
253 (GetCompletions, Background),
254 (GetCompletionsResponse, Background),
255 (GetDefinition, Background),
256 (GetDefinitionResponse, Background),
257 (GetDeclaration, Background),
258 (GetDeclarationResponse, Background),
259 (GetDocumentHighlights, Background),
260 (GetDocumentHighlightsResponse, Background),
261 (GetHover, Background),
262 (GetHoverResponse, Background),
263 (GetNotifications, Foreground),
264 (GetNotificationsResponse, Foreground),
265 (GetPrivateUserInfo, Foreground),
266 (GetPrivateUserInfoResponse, Foreground),
267 (GetProjectSymbols, Background),
268 (GetProjectSymbolsResponse, Background),
269 (GetReferences, Background),
270 (GetReferencesResponse, Background),
271 (GetSignatureHelp, Background),
272 (GetSignatureHelpResponse, Background),
273 (GetSupermavenApiKey, Background),
274 (GetSupermavenApiKeyResponse, Background),
275 (GetTypeDefinition, Background),
276 (GetTypeDefinitionResponse, Background),
277 (GetImplementation, Background),
278 (GetImplementationResponse, Background),
279 (GetLlmToken, Background),
280 (GetLlmTokenResponse, Background),
281 (OpenUnstagedDiff, Foreground),
282 (OpenUnstagedDiffResponse, Foreground),
283 (OpenUncommittedDiff, Foreground),
284 (OpenUncommittedDiffResponse, Foreground),
285 (GetUsers, Foreground),
286 (Hello, Foreground),
287 (IncomingCall, Foreground),
288 (InlayHints, Background),
289 (InlayHintsResponse, Background),
290 (InviteChannelMember, Foreground),
291 (JoinChannel, Foreground),
292 (JoinChannelBuffer, Foreground),
293 (JoinChannelBufferResponse, Foreground),
294 (JoinChannelChat, Foreground),
295 (JoinChannelChatResponse, Foreground),
296 (JoinProject, Foreground),
297 (JoinProjectResponse, Foreground),
298 (JoinRoom, Foreground),
299 (JoinRoomResponse, Foreground),
300 (LeaveChannelBuffer, Background),
301 (LeaveChannelChat, Foreground),
302 (LeaveProject, Foreground),
303 (LeaveRoom, Foreground),
304 (MarkNotificationRead, Foreground),
305 (MoveChannel, Foreground),
306 (OnTypeFormatting, Background),
307 (OnTypeFormattingResponse, Background),
308 (OpenBufferById, Background),
309 (OpenBufferByPath, Background),
310 (OpenBufferForSymbol, Background),
311 (OpenBufferForSymbolResponse, Background),
312 (OpenBufferResponse, Background),
313 (OpenCommitMessageBuffer, Background),
314 (PerformRename, Background),
315 (PerformRenameResponse, Background),
316 (Ping, Foreground),
317 (PrepareRename, Background),
318 (PrepareRenameResponse, Background),
319 (ProjectEntryResponse, Foreground),
320 (CountLanguageModelTokens, Background),
321 (CountLanguageModelTokensResponse, Background),
322 (RefreshLlmToken, Background),
323 (RefreshInlayHints, Foreground),
324 (RejoinChannelBuffers, Foreground),
325 (RejoinChannelBuffersResponse, Foreground),
326 (RejoinRoom, Foreground),
327 (RejoinRoomResponse, Foreground),
328 (ReloadBuffers, Foreground),
329 (ReloadBuffersResponse, Foreground),
330 (RemoveChannelMember, Foreground),
331 (RemoveChannelMessage, Foreground),
332 (UpdateChannelMessage, Foreground),
333 (RemoveContact, Foreground),
334 (RemoveProjectCollaborator, Foreground),
335 (RenameChannel, Foreground),
336 (RenameChannelResponse, Foreground),
337 (RenameProjectEntry, Foreground),
338 (RequestContact, Foreground),
339 (ResolveCompletionDocumentation, Background),
340 (ResolveCompletionDocumentationResponse, Background),
341 (ResolveInlayHint, Background),
342 (ResolveInlayHintResponse, Background),
343 (RespondToChannelInvite, Foreground),
344 (RespondToContactRequest, Foreground),
345 (RoomUpdated, Foreground),
346 (SaveBuffer, Foreground),
347 (SetChannelMemberRole, Foreground),
348 (SetChannelVisibility, Foreground),
349 (SendChannelMessage, Background),
350 (SendChannelMessageResponse, Background),
351 (ShareProject, Foreground),
352 (ShareProjectResponse, Foreground),
353 (ShowContacts, Foreground),
354 (Stage, Background),
355 (StartLanguageServer, Foreground),
356 (SubscribeToChannels, Foreground),
357 (SynchronizeBuffers, Foreground),
358 (SynchronizeBuffersResponse, Foreground),
359 (TaskContextForLocation, Background),
360 (TaskContext, Background),
361 (Test, Foreground),
362 (Unfollow, Foreground),
363 (UnshareProject, Foreground),
364 (Unstage, Background),
365 (UpdateBuffer, Foreground),
366 (UpdateBufferFile, Foreground),
367 (UpdateChannelBuffer, Foreground),
368 (UpdateChannelBufferCollaborators, Foreground),
369 (UpdateChannels, Foreground),
370 (UpdateUserChannels, Foreground),
371 (UpdateContacts, Foreground),
372 (UpdateDiagnosticSummary, Foreground),
373 (UpdateDiffBases, Foreground),
374 (UpdateFollowers, Foreground),
375 (UpdateInviteInfo, Foreground),
376 (UpdateLanguageServer, Foreground),
377 (UpdateParticipantLocation, Foreground),
378 (UpdateProject, Foreground),
379 (UpdateProjectCollaborator, Foreground),
380 (UpdateUserPlan, Foreground),
381 (UpdateWorktree, Foreground),
382 (UpdateWorktreeSettings, Foreground),
383 (UsersResponse, Foreground),
384 (LspExtExpandMacro, Background),
385 (LspExtExpandMacroResponse, Background),
386 (LspExtOpenDocs, Background),
387 (LspExtOpenDocsResponse, Background),
388 (SetRoomParticipantRole, Foreground),
389 (BlameBuffer, Foreground),
390 (BlameBufferResponse, Foreground),
391 (RejoinRemoteProjects, Foreground),
392 (RejoinRemoteProjectsResponse, Foreground),
393 (MultiLspQuery, Background),
394 (MultiLspQueryResponse, Background),
395 (ListRemoteDirectory, Background),
396 (ListRemoteDirectoryResponse, Background),
397 (OpenNewBuffer, Foreground),
398 (RestartLanguageServers, Foreground),
399 (LinkedEditingRange, Background),
400 (LinkedEditingRangeResponse, Background),
401 (AdvertiseContexts, Foreground),
402 (OpenContext, Foreground),
403 (OpenContextResponse, Foreground),
404 (CreateContext, Foreground),
405 (CreateContextResponse, Foreground),
406 (UpdateContext, Foreground),
407 (SynchronizeContexts, Foreground),
408 (SynchronizeContextsResponse, Foreground),
409 (LspExtSwitchSourceHeader, Background),
410 (LspExtSwitchSourceHeaderResponse, Background),
411 (AddWorktree, Foreground),
412 (AddWorktreeResponse, Foreground),
413 (FindSearchCandidates, Background),
414 (FindSearchCandidatesResponse, Background),
415 (CloseBuffer, Foreground),
416 (ShutdownRemoteServer, Foreground),
417 (RemoveWorktree, Foreground),
418 (LanguageServerLog, Foreground),
419 (Toast, Background),
420 (HideToast, Background),
421 (OpenServerSettings, Foreground),
422 (GetPermalinkToLine, Foreground),
423 (GetPermalinkToLineResponse, Foreground),
424 (FlushBufferedMessages, Foreground),
425 (LanguageServerPromptRequest, Foreground),
426 (LanguageServerPromptResponse, Foreground),
427 (GitGetBranches, Background),
428 (GitBranchesResponse, Background),
429 (UpdateGitBranch, Background),
430 (ListToolchains, Foreground),
431 (ListToolchainsResponse, Foreground),
432 (ActivateToolchain, Foreground),
433 (ActiveToolchain, Foreground),
434 (ActiveToolchainResponse, Foreground),
435 (GetPathMetadata, Background),
436 (GetPathMetadataResponse, Background),
437 (GetPanicFiles, Background),
438 (GetPanicFilesResponse, Background),
439 (CancelLanguageServerWork, Foreground),
440 (SyncExtensions, Background),
441 (SyncExtensionsResponse, Background),
442 (InstallExtension, Background),
443 (RegisterBufferWithLanguageServers, Background),
444 (GitReset, Background),
445 (GitCheckoutFiles, Background),
446 (GitShow, Background),
447 (GitCommitDetails, Background),
448 (SetIndexText, Background),
449 (Push, Background),
450 (Fetch, Background),
451 (GetRemotes, Background),
452 (GetRemotesResponse, Background),
453 (Pull, Background),
454 (RemoteMessageResponse, Background),
455 (AskPassRequest, Background),
456 (AskPassResponse, Background),
457 (GitCreateBranch, Background),
458 (GitChangeBranch, Background),
459 (CheckForPushedCommits, Background),
460 (CheckForPushedCommitsResponse, Background),
461);
462
463request_messages!(
464 (AcceptTermsOfService, AcceptTermsOfServiceResponse),
465 (ApplyCodeAction, ApplyCodeActionResponse),
466 (
467 ApplyCompletionAdditionalEdits,
468 ApplyCompletionAdditionalEditsResponse
469 ),
470 (Call, Ack),
471 (CancelCall, Ack),
472 (Commit, Ack),
473 (CopyProjectEntry, ProjectEntryResponse),
474 (ComputeEmbeddings, ComputeEmbeddingsResponse),
475 (CreateChannel, CreateChannelResponse),
476 (CreateProjectEntry, ProjectEntryResponse),
477 (CreateRoom, CreateRoomResponse),
478 (DeclineCall, Ack),
479 (DeleteChannel, Ack),
480 (DeleteProjectEntry, ProjectEntryResponse),
481 (ExpandProjectEntry, ExpandProjectEntryResponse),
482 (ExpandAllForProjectEntry, ExpandAllForProjectEntryResponse),
483 (Follow, FollowResponse),
484 (ApplyCodeActionKind, ApplyCodeActionKindResponse),
485 (FormatBuffers, FormatBuffersResponse),
486 (FuzzySearchUsers, UsersResponse),
487 (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
488 (GetChannelMembers, GetChannelMembersResponse),
489 (GetChannelMessages, GetChannelMessagesResponse),
490 (GetChannelMessagesById, GetChannelMessagesResponse),
491 (GetCodeActions, GetCodeActionsResponse),
492 (GetCompletions, GetCompletionsResponse),
493 (GetDefinition, GetDefinitionResponse),
494 (GetDeclaration, GetDeclarationResponse),
495 (GetImplementation, GetImplementationResponse),
496 (GetDocumentHighlights, GetDocumentHighlightsResponse),
497 (GetHover, GetHoverResponse),
498 (GetLlmToken, GetLlmTokenResponse),
499 (GetNotifications, GetNotificationsResponse),
500 (GetPrivateUserInfo, GetPrivateUserInfoResponse),
501 (GetProjectSymbols, GetProjectSymbolsResponse),
502 (GetReferences, GetReferencesResponse),
503 (GetSignatureHelp, GetSignatureHelpResponse),
504 (OpenUnstagedDiff, OpenUnstagedDiffResponse),
505 (OpenUncommittedDiff, OpenUncommittedDiffResponse),
506 (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
507 (GetTypeDefinition, GetTypeDefinitionResponse),
508 (LinkedEditingRange, LinkedEditingRangeResponse),
509 (ListRemoteDirectory, ListRemoteDirectoryResponse),
510 (GetUsers, UsersResponse),
511 (IncomingCall, Ack),
512 (InlayHints, InlayHintsResponse),
513 (InviteChannelMember, Ack),
514 (JoinChannel, JoinRoomResponse),
515 (JoinChannelBuffer, JoinChannelBufferResponse),
516 (JoinChannelChat, JoinChannelChatResponse),
517 (JoinProject, JoinProjectResponse),
518 (JoinRoom, JoinRoomResponse),
519 (LeaveChannelBuffer, Ack),
520 (LeaveRoom, Ack),
521 (MarkNotificationRead, Ack),
522 (MoveChannel, Ack),
523 (OnTypeFormatting, OnTypeFormattingResponse),
524 (OpenBufferById, OpenBufferResponse),
525 (OpenBufferByPath, OpenBufferResponse),
526 (OpenBufferForSymbol, OpenBufferForSymbolResponse),
527 (OpenCommitMessageBuffer, OpenBufferResponse),
528 (OpenNewBuffer, OpenBufferResponse),
529 (PerformRename, PerformRenameResponse),
530 (Ping, Ack),
531 (PrepareRename, PrepareRenameResponse),
532 (CountLanguageModelTokens, CountLanguageModelTokensResponse),
533 (RefreshInlayHints, Ack),
534 (RejoinChannelBuffers, RejoinChannelBuffersResponse),
535 (RejoinRoom, RejoinRoomResponse),
536 (ReloadBuffers, ReloadBuffersResponse),
537 (RemoveChannelMember, Ack),
538 (RemoveChannelMessage, Ack),
539 (UpdateChannelMessage, Ack),
540 (RemoveContact, Ack),
541 (RenameChannel, RenameChannelResponse),
542 (RenameProjectEntry, ProjectEntryResponse),
543 (RequestContact, Ack),
544 (
545 ResolveCompletionDocumentation,
546 ResolveCompletionDocumentationResponse
547 ),
548 (ResolveInlayHint, ResolveInlayHintResponse),
549 (RespondToChannelInvite, Ack),
550 (RespondToContactRequest, Ack),
551 (SaveBuffer, BufferSaved),
552 (Stage, Ack),
553 (FindSearchCandidates, FindSearchCandidatesResponse),
554 (SendChannelMessage, SendChannelMessageResponse),
555 (SetChannelMemberRole, Ack),
556 (SetChannelVisibility, Ack),
557 (ShareProject, ShareProjectResponse),
558 (SynchronizeBuffers, SynchronizeBuffersResponse),
559 (TaskContextForLocation, TaskContext),
560 (Test, Test),
561 (Unstage, Ack),
562 (UpdateBuffer, Ack),
563 (UpdateParticipantLocation, Ack),
564 (UpdateProject, Ack),
565 (UpdateWorktree, Ack),
566 (LspExtExpandMacro, LspExtExpandMacroResponse),
567 (LspExtOpenDocs, LspExtOpenDocsResponse),
568 (SetRoomParticipantRole, Ack),
569 (BlameBuffer, BlameBufferResponse),
570 (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
571 (MultiLspQuery, MultiLspQueryResponse),
572 (RestartLanguageServers, Ack),
573 (OpenContext, OpenContextResponse),
574 (CreateContext, CreateContextResponse),
575 (SynchronizeContexts, SynchronizeContextsResponse),
576 (LspExtSwitchSourceHeader, LspExtSwitchSourceHeaderResponse),
577 (AddWorktree, AddWorktreeResponse),
578 (ShutdownRemoteServer, Ack),
579 (RemoveWorktree, Ack),
580 (OpenServerSettings, OpenBufferResponse),
581 (GetPermalinkToLine, GetPermalinkToLineResponse),
582 (FlushBufferedMessages, Ack),
583 (LanguageServerPromptRequest, LanguageServerPromptResponse),
584 (GitGetBranches, GitBranchesResponse),
585 (UpdateGitBranch, Ack),
586 (ListToolchains, ListToolchainsResponse),
587 (ActivateToolchain, Ack),
588 (ActiveToolchain, ActiveToolchainResponse),
589 (GetPathMetadata, GetPathMetadataResponse),
590 (GetPanicFiles, GetPanicFilesResponse),
591 (CancelLanguageServerWork, Ack),
592 (SyncExtensions, SyncExtensionsResponse),
593 (InstallExtension, Ack),
594 (RegisterBufferWithLanguageServers, Ack),
595 (GitShow, GitCommitDetails),
596 (GitReset, Ack),
597 (GitCheckoutFiles, Ack),
598 (SetIndexText, Ack),
599 (Push, RemoteMessageResponse),
600 (Fetch, RemoteMessageResponse),
601 (GetRemotes, GetRemotesResponse),
602 (Pull, RemoteMessageResponse),
603 (AskPassRequest, AskPassResponse),
604 (GitCreateBranch, Ack),
605 (GitChangeBranch, Ack),
606 (CheckForPushedCommits, CheckForPushedCommitsResponse),
607);
608
609entity_messages!(
610 {project_id, ShareProject},
611 AddProjectCollaborator,
612 AddWorktree,
613 ApplyCodeAction,
614 ApplyCompletionAdditionalEdits,
615 BlameBuffer,
616 BufferReloaded,
617 BufferSaved,
618 CloseBuffer,
619 Commit,
620 CopyProjectEntry,
621 CreateBufferForPeer,
622 CreateProjectEntry,
623 DeleteProjectEntry,
624 ExpandProjectEntry,
625 ExpandAllForProjectEntry,
626 FindSearchCandidates,
627 ApplyCodeActionKind,
628 FormatBuffers,
629 GetCodeActions,
630 GetCompletions,
631 GetDefinition,
632 GetDeclaration,
633 GetImplementation,
634 GetDocumentHighlights,
635 GetHover,
636 GetProjectSymbols,
637 GetReferences,
638 GetSignatureHelp,
639 OpenUnstagedDiff,
640 OpenUncommittedDiff,
641 GetTypeDefinition,
642 InlayHints,
643 JoinProject,
644 LeaveProject,
645 LinkedEditingRange,
646 MultiLspQuery,
647 RestartLanguageServers,
648 OnTypeFormatting,
649 OpenNewBuffer,
650 OpenBufferById,
651 OpenBufferByPath,
652 OpenBufferForSymbol,
653 OpenCommitMessageBuffer,
654 PerformRename,
655 PrepareRename,
656 RefreshInlayHints,
657 ReloadBuffers,
658 RemoveProjectCollaborator,
659 RenameProjectEntry,
660 ResolveCompletionDocumentation,
661 ResolveInlayHint,
662 SaveBuffer,
663 Stage,
664 StartLanguageServer,
665 SynchronizeBuffers,
666 TaskContextForLocation,
667 UnshareProject,
668 Unstage,
669 UpdateBuffer,
670 UpdateBufferFile,
671 UpdateDiagnosticSummary,
672 UpdateDiffBases,
673 UpdateLanguageServer,
674 UpdateProject,
675 UpdateProjectCollaborator,
676 UpdateWorktree,
677 UpdateWorktreeSettings,
678 LspExtExpandMacro,
679 LspExtOpenDocs,
680 AdvertiseContexts,
681 OpenContext,
682 CreateContext,
683 UpdateContext,
684 SynchronizeContexts,
685 LspExtSwitchSourceHeader,
686 LanguageServerLog,
687 Toast,
688 HideToast,
689 OpenServerSettings,
690 GetPermalinkToLine,
691 LanguageServerPromptRequest,
692 GitGetBranches,
693 UpdateGitBranch,
694 ListToolchains,
695 ActivateToolchain,
696 ActiveToolchain,
697 GetPathMetadata,
698 CancelLanguageServerWork,
699 RegisterBufferWithLanguageServers,
700 GitShow,
701 GitReset,
702 GitCheckoutFiles,
703 SetIndexText,
704 Push,
705 Fetch,
706 GetRemotes,
707 Pull,
708 AskPassRequest,
709 GitChangeBranch,
710 GitCreateBranch,
711 CheckForPushedCommits,
712);
713
714entity_messages!(
715 {channel_id, Channel},
716 ChannelMessageSent,
717 ChannelMessageUpdate,
718 RemoveChannelMessage,
719 UpdateChannelMessage,
720 UpdateChannelBuffer,
721 UpdateChannelBufferCollaborators,
722);
723
724impl From<Timestamp> for SystemTime {
725 fn from(val: Timestamp) -> Self {
726 UNIX_EPOCH
727 .checked_add(Duration::new(val.seconds, val.nanos))
728 .unwrap()
729 }
730}
731
732impl From<SystemTime> for Timestamp {
733 fn from(time: SystemTime) -> Self {
734 let duration = time.duration_since(UNIX_EPOCH).unwrap();
735 Self {
736 seconds: duration.as_secs(),
737 nanos: duration.subsec_nanos(),
738 }
739 }
740}
741
742impl From<u128> for Nonce {
743 fn from(nonce: u128) -> Self {
744 let upper_half = (nonce >> 64) as u64;
745 let lower_half = nonce as u64;
746 Self {
747 upper_half,
748 lower_half,
749 }
750 }
751}
752
753impl From<Nonce> for u128 {
754 fn from(nonce: Nonce) -> Self {
755 let upper_half = (nonce.upper_half as u128) << 64;
756 let lower_half = nonce.lower_half as u128;
757 upper_half | lower_half
758 }
759}
760
761#[cfg(any(test, feature = "test-support"))]
762pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 2;
763#[cfg(not(any(test, feature = "test-support")))]
764pub const MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE: usize = 256;
765
766pub fn split_worktree_update(mut message: UpdateWorktree) -> impl Iterator<Item = UpdateWorktree> {
767 let mut done = false;
768
769 iter::from_fn(move || {
770 if done {
771 return None;
772 }
773
774 let updated_entries_chunk_size = cmp::min(
775 message.updated_entries.len(),
776 MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
777 );
778 let updated_entries: Vec<_> = message
779 .updated_entries
780 .drain(..updated_entries_chunk_size)
781 .collect();
782
783 let removed_entries_chunk_size = cmp::min(
784 message.removed_entries.len(),
785 MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE,
786 );
787 let removed_entries = message
788 .removed_entries
789 .drain(..removed_entries_chunk_size)
790 .collect();
791
792 let mut updated_repositories = Vec::new();
793 let mut limit = MAX_WORKTREE_UPDATE_MAX_CHUNK_SIZE;
794 while let Some(repo) = message.updated_repositories.first_mut() {
795 let updated_statuses_limit = cmp::min(repo.updated_statuses.len(), limit);
796 let removed_statuses_limit = cmp::min(repo.removed_statuses.len(), limit);
797
798 updated_repositories.push(RepositoryEntry {
799 work_directory_id: repo.work_directory_id,
800 branch: repo.branch.clone(),
801 branch_summary: repo.branch_summary.clone(),
802 updated_statuses: repo
803 .updated_statuses
804 .drain(..updated_statuses_limit)
805 .collect(),
806 removed_statuses: repo
807 .removed_statuses
808 .drain(..removed_statuses_limit)
809 .collect(),
810 current_merge_conflicts: repo.current_merge_conflicts.clone(),
811 });
812 if repo.removed_statuses.is_empty() && repo.updated_statuses.is_empty() {
813 message.updated_repositories.remove(0);
814 }
815 limit = limit.saturating_sub(removed_statuses_limit + updated_statuses_limit);
816 if limit == 0 {
817 break;
818 }
819 }
820
821 done = message.updated_entries.is_empty()
822 && message.removed_entries.is_empty()
823 && message.updated_repositories.is_empty();
824
825 let removed_repositories = if done {
826 mem::take(&mut message.removed_repositories)
827 } else {
828 Default::default()
829 };
830
831 Some(UpdateWorktree {
832 project_id: message.project_id,
833 worktree_id: message.worktree_id,
834 root_name: message.root_name.clone(),
835 abs_path: message.abs_path.clone(),
836 updated_entries,
837 removed_entries,
838 scan_id: message.scan_id,
839 is_last_update: done && message.is_last_update,
840 updated_repositories,
841 removed_repositories,
842 })
843 })
844}
845
846#[cfg(test)]
847mod tests {
848 use super::*;
849
850 #[test]
851 fn test_converting_peer_id_from_and_to_u64() {
852 let peer_id = PeerId {
853 owner_id: 10,
854 id: 3,
855 };
856 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
857 let peer_id = PeerId {
858 owner_id: u32::MAX,
859 id: 3,
860 };
861 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
862 let peer_id = PeerId {
863 owner_id: 10,
864 id: u32::MAX,
865 };
866 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
867 let peer_id = PeerId {
868 owner_id: u32::MAX,
869 id: u32::MAX,
870 };
871 assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
872 }
873
874 #[test]
875 #[cfg(target_os = "windows")]
876 fn test_proto() {
877 fn generate_proto_path(path: PathBuf) -> PathBuf {
878 let proto = path.to_proto();
879 PathBuf::from_proto(proto)
880 }
881
882 let path = PathBuf::from("C:\\foo\\bar");
883 assert_eq!(path, generate_proto_path(path.clone()));
884
885 let path = PathBuf::from("C:/foo/bar/");
886 assert_eq!(path, generate_proto_path(path.clone()));
887
888 let path = PathBuf::from("C:/foo\\bar\\");
889 assert_eq!(path, generate_proto_path(path.clone()));
890 }
891}