atman_runtime/
submission_queue.rs1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use uuid::Uuid;
4
5use crate::InvocationEnv;
6use crate::message::{ImageSource, MessageOrigin};
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
9#[serde(transparent)]
10pub struct SubmissionId(Uuid);
11
12impl SubmissionId {
13 pub fn now() -> Self {
14 Self(Uuid::now_v7())
15 }
16}
17
18impl std::fmt::Display for SubmissionId {
19 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
20 self.0.fmt(f)
21 }
22}
23
24#[derive(Debug, Clone)]
25pub struct QueuedSubmission {
26 pub id: SubmissionId,
27 pub revision: u64,
28 pub text: String,
29 pub images: Vec<ImageSource>,
30 pub invocation_env: InvocationEnv,
31 pub created_at: DateTime<Utc>,
32 pub origin: MessageOrigin,
33}
34
35impl QueuedSubmission {
36 pub fn new(
37 text: impl Into<String>,
38 images: Vec<ImageSource>,
39 invocation_env: InvocationEnv,
40 origin: MessageOrigin,
41 ) -> Self {
42 Self {
43 id: SubmissionId::now(),
44 revision: 0,
45 text: text.into(),
46 images,
47 invocation_env,
48 created_at: Utc::now(),
49 origin,
50 }
51 }
52}
53
54#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
55pub struct QueuedSubmissionView {
56 pub id: SubmissionId,
57 pub revision: u64,
58 pub text: String,
59 pub created_at: DateTime<Utc>,
60}
61
62impl From<&QueuedSubmission> for QueuedSubmissionView {
63 fn from(submission: &QueuedSubmission) -> Self {
64 Self {
65 id: submission.id.clone(),
66 revision: submission.revision,
67 text: submission.text.clone(),
68 created_at: submission.created_at,
69 }
70 }
71}
72
73#[derive(Debug, Clone, Copy, PartialEq, Eq)]
74pub enum SubmissionMove {
75 Up,
76 Down,
77}
78
79#[derive(Debug, thiserror::Error, PartialEq, Eq)]
80pub enum SubmissionQueueError {
81 #[error("queued submission text cannot be empty")]
82 EmptyText,
83 #[error("queued submission not found")]
84 NotFound,
85 #[error("queued submission changed; refresh and try again")]
86 RevisionConflict,
87}