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, Debug, Default)]
186pub struct ListObjectsOptions {
187 pub filter: Vec<(String, serde_json::Value)>,
191 pub limit: Option<u64>,
193 pub offset: Option<u64>,
195}
196
197#[derive(Clone, Copy, Debug, Eq, PartialEq)]
199pub struct QueueClaimOptions {
200 pub lease_ms: u64,
202}
203
204impl Default for QueueClaimOptions {
205 fn default() -> Self {
206 Self {
207 lease_ms: DEFAULT_QUEUE_LEASE_MS,
208 }
209 }
210}
211
212impl QueueClaimOptions {
213 #[must_use]
215 pub const fn new(lease_ms: u64) -> Self {
216 Self { lease_ms }
217 }
218}
219
220#[derive(Clone, Debug, Eq, PartialEq, Default)]
222pub struct QueueNackOptions {
223 pub delay_ms: u64,
225 pub error: String,
227}
228
229impl QueueNackOptions {
230 #[must_use]
232 pub const fn new(delay_ms: u64) -> Self {
233 Self {
234 delay_ms,
235 error: String::new(),
236 }
237 }
238
239 #[must_use]
241 pub fn with_error(delay_ms: u64, error: impl Into<String>) -> Self {
242 Self {
243 delay_ms,
244 error: error.into(),
245 }
246 }
247}
248
249#[derive(Clone, Debug, Eq, PartialEq, Default)]
251pub struct SearchOptions {
252 pub collections: Option<Vec<String>>,
254 pub limit: Option<usize>,
256 pub filter: Option<serde_json::Value>,
258}
259
260#[derive(Clone, Debug, PartialEq)]
262pub struct SearchHit {
263 pub kind: String,
265 pub collection: String,
267 pub id: String,
269 pub text: String,
271 pub score: f64,
273 pub body: String,
275 pub version: Option<u64>,
277 pub created_at: String,
279 pub updated_at: Option<String>,
281 pub event_type: Option<String>,
283}
284
285#[derive(Clone, Debug, PartialEq)]
287pub struct Link {
288 pub id: String,
290 pub from_ref: String,
292 pub link_type: String,
294 pub to_ref: String,
296 pub weight: Option<f64>,
298 pub metadata_json: String,
300 pub created_at: String,
302}
303
304impl Link {
305 pub fn new(
307 from_ref: impl Into<String>,
308 link_type: impl Into<String>,
309 to_ref: impl Into<String>,
310 ) -> Self {
311 Self {
312 id: String::new(),
313 from_ref: from_ref.into(),
314 link_type: link_type.into(),
315 to_ref: to_ref.into(),
316 weight: None,
317 metadata_json: "{}".to_string(),
318 created_at: String::new(),
319 }
320 }
321
322 #[must_use]
324 pub const fn with_weight(mut self, weight: f64) -> Self {
325 self.weight = Some(weight);
326 self
327 }
328
329 #[must_use]
331 pub fn with_metadata(mut self, metadata: impl Into<String>) -> Self {
332 self.metadata_json = metadata.into();
333 self
334 }
335}
336
337#[derive(Clone, Debug, Default, Eq, PartialEq)]
339pub struct LinkQueryOptions {
340 pub link_type: Option<String>,
342 pub limit: Option<usize>,
344}
345
346#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
348pub enum LinkDirection {
349 Outgoing,
351 Incoming,
353 #[default]
355 Both,
356}