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