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