code_moniker_workspace/registry/
event.rs1use crate::snapshot::ResourceGeneration;
2
3use super::command::{WorkspaceCommandId, WorkspaceScopeUri};
4
5#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
6pub struct WorkspaceEventCursor(usize);
7
8impl WorkspaceEventCursor {
9 pub fn start() -> Self {
10 Self(0)
11 }
12
13 pub fn value(self) -> usize {
14 self.0
15 }
16}
17
18#[derive(Clone, Copy, Debug, Eq, PartialEq)]
19pub enum WorkspaceEventKind {
20 CommandAccepted,
21 WorkStarted,
22 WorkCompleted,
23 WorkFailed,
24 SnapshotPublished,
25 StaleMarked,
26}
27
28#[derive(Clone, Debug, Eq, PartialEq)]
29pub struct WorkspaceEvent {
30 pub scope_uri: WorkspaceScopeUri,
31 pub generation: ResourceGeneration,
32 pub command_id: WorkspaceCommandId,
33 pub kind: WorkspaceEventKind,
34}
35
36pub(crate) struct WorkspaceEventContext {
37 scope_uri: WorkspaceScopeUri,
38 generation: ResourceGeneration,
39 command_id: WorkspaceCommandId,
40}
41
42impl WorkspaceEventContext {
43 pub(crate) fn new(
44 scope_uri: WorkspaceScopeUri,
45 generation: ResourceGeneration,
46 command_id: WorkspaceCommandId,
47 ) -> Self {
48 Self {
49 scope_uri,
50 generation,
51 command_id,
52 }
53 }
54
55 pub(crate) fn event(&self, kind: WorkspaceEventKind) -> WorkspaceEvent {
56 WorkspaceEvent {
57 scope_uri: self.scope_uri.clone(),
58 generation: self.generation,
59 command_id: self.command_id,
60 kind,
61 }
62 }
63}
64
65#[derive(Default)]
66pub(crate) struct WorkspaceEventLog {
67 events: Vec<WorkspaceEvent>,
68}
69
70impl WorkspaceEventLog {
71 pub(crate) fn cursor(&self) -> WorkspaceEventCursor {
72 WorkspaceEventCursor(self.events.len())
73 }
74
75 pub(crate) fn publish(&mut self, event: WorkspaceEvent) {
76 self.events.push(event);
77 }
78
79 pub(crate) fn since(&self, cursor: WorkspaceEventCursor) -> &[WorkspaceEvent] {
80 let start = cursor.value().min(self.events.len());
81 &self.events[start..]
82 }
83}