1use crate::{u64_to_i64, unix_timestamp_millis};
4
5pub const DEFAULT_QUEUE_LEASE_MS: u64 = 30_000;
7
8#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd)]
10pub struct ObjectKey {
11 pub collection: String,
13 pub id: String,
15}
16
17impl ObjectKey {
18 pub fn new(collection: impl Into<String>, id: impl Into<String>) -> Self {
20 Self {
21 collection: collection.into(),
22 id: id.into(),
23 }
24 }
25}
26
27#[derive(Clone, Debug, Eq, PartialEq)]
29pub struct MemoryObject {
30 pub key: ObjectKey,
32 pub body: String,
34 pub version: u64,
36 pub created_at: String,
38 pub updated_at: String,
40}
41
42impl MemoryObject {
43 pub fn new(
45 collection: impl Into<String>,
46 id: impl Into<String>,
47 body: impl Into<String>,
48 ) -> Self {
49 Self {
50 key: ObjectKey::new(collection, id),
51 body: body.into(),
52 version: 0,
53 created_at: String::new(),
54 updated_at: String::new(),
55 }
56 }
57}
58
59#[derive(Clone, Debug, Eq, PartialEq)]
61pub struct MemoryEvent {
62 pub stream: String,
64 pub event_type: String,
66 pub body: String,
68 pub sequence: u64,
70 pub created_at: String,
72}
73
74impl MemoryEvent {
75 pub fn new(
77 stream: impl Into<String>,
78 event_type: impl Into<String>,
79 body: impl Into<String>,
80 ) -> Self {
81 Self {
82 stream: stream.into(),
83 event_type: event_type.into(),
84 body: body.into(),
85 sequence: 0,
86 created_at: String::new(),
87 }
88 }
89}
90
91#[derive(Clone, Copy, Debug, Eq, PartialEq)]
93pub enum QueueJobStatus {
94 Ready,
96 Leased,
98 Completed,
100 Dead,
102}
103
104#[derive(Clone, Debug, Eq, PartialEq)]
106pub struct QueueJob {
107 pub queue: String,
109 pub id: String,
111 pub body: String,
113 pub attempts: u32,
115 pub max_attempts: u32,
117 pub status: QueueJobStatus,
119 pub available_at_ms: i64,
121 pub leased_at_ms: Option<i64>,
123 pub lease_expires_at_ms: Option<i64>,
125 pub completed_at_ms: Option<i64>,
127 pub dead_at_ms: Option<i64>,
129 pub created_at: String,
131 pub last_error: String,
133}
134
135impl QueueJob {
136 pub fn new(
138 queue: impl Into<String>,
139 id: impl Into<String>,
140 body: impl Into<String>,
141 max_attempts: u32,
142 ) -> Self {
143 Self {
144 queue: queue.into(),
145 id: id.into(),
146 body: body.into(),
147 attempts: 0,
148 max_attempts,
149 status: QueueJobStatus::Ready,
150 available_at_ms: 0,
151 leased_at_ms: None,
152 lease_expires_at_ms: None,
153 completed_at_ms: None,
154 dead_at_ms: None,
155 created_at: String::new(),
156 last_error: String::new(),
157 }
158 }
159
160 #[must_use]
162 pub fn delay_by_ms(mut self, delay_ms: u64) -> Self {
163 self.available_at_ms = unix_timestamp_millis().saturating_add(u64_to_i64(delay_ms));
164 self
165 }
166
167 #[must_use]
169 pub const fn available_at_ms(mut self, available_at_ms: i64) -> Self {
170 self.available_at_ms = available_at_ms;
171 self
172 }
173}
174
175#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
177pub struct ListEventsOptions {
178 pub from_sequence: Option<u64>,
180 pub limit: Option<u64>,
182}
183
184#[derive(Clone, Copy, Debug, Eq, PartialEq)]
186pub struct QueueClaimOptions {
187 pub lease_ms: u64,
189}
190
191impl Default for QueueClaimOptions {
192 fn default() -> Self {
193 Self {
194 lease_ms: DEFAULT_QUEUE_LEASE_MS,
195 }
196 }
197}
198
199impl QueueClaimOptions {
200 #[must_use]
202 pub const fn new(lease_ms: u64) -> Self {
203 Self { lease_ms }
204 }
205}
206
207#[derive(Clone, Debug, Eq, PartialEq, Default)]
209pub struct QueueNackOptions {
210 pub delay_ms: u64,
212 pub error: String,
214}
215
216impl QueueNackOptions {
217 #[must_use]
219 pub const fn new(delay_ms: u64) -> Self {
220 Self {
221 delay_ms,
222 error: String::new(),
223 }
224 }
225
226 #[must_use]
228 pub fn with_error(delay_ms: u64, error: impl Into<String>) -> Self {
229 Self {
230 delay_ms,
231 error: error.into(),
232 }
233 }
234}
235
236#[derive(Clone, Debug, Eq, PartialEq, Default)]
238pub struct SearchOptions {
239 pub collections: Option<Vec<String>>,
241 pub limit: Option<usize>,
243 pub filter: Option<serde_json::Value>,
245}
246
247#[derive(Clone, Debug, PartialEq)]
249pub struct SearchHit {
250 pub kind: String,
252 pub collection: String,
254 pub id: String,
256 pub text: String,
258 pub score: f64,
260 pub body: String,
262 pub version: Option<u64>,
264 pub created_at: String,
266 pub updated_at: Option<String>,
268 pub event_type: Option<String>,
270}
271
272#[derive(Clone, Debug, PartialEq)]
274pub struct Link {
275 pub id: String,
277 pub from_ref: String,
279 pub link_type: String,
281 pub to_ref: String,
283 pub weight: Option<f64>,
285 pub metadata_json: String,
287 pub created_at: String,
289}
290
291impl Link {
292 pub fn new(
294 from_ref: impl Into<String>,
295 link_type: impl Into<String>,
296 to_ref: impl Into<String>,
297 ) -> Self {
298 Self {
299 id: String::new(),
300 from_ref: from_ref.into(),
301 link_type: link_type.into(),
302 to_ref: to_ref.into(),
303 weight: None,
304 metadata_json: "{}".to_string(),
305 created_at: String::new(),
306 }
307 }
308
309 #[must_use]
311 pub const fn with_weight(mut self, weight: f64) -> Self {
312 self.weight = Some(weight);
313 self
314 }
315
316 #[must_use]
318 pub fn with_metadata(mut self, metadata: impl Into<String>) -> Self {
319 self.metadata_json = metadata.into();
320 self
321 }
322}
323
324#[derive(Clone, Debug, Default, Eq, PartialEq)]
326pub struct LinkQueryOptions {
327 pub link_type: Option<String>,
329 pub limit: Option<usize>,
331}
332
333#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
335pub enum LinkDirection {
336 Outgoing,
338 Incoming,
340 #[default]
342 Both,
343}