Skip to main content

atman_runtime/
submission_queue.rs

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