Skip to main content

code_moniker_workspace/registry/
event.rs

1use 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}