apalis_core/backend/
queue.rs1use std::{str::FromStr, sync::Arc};
15
16use crate::task::{
17 Task,
18 from_request::FromRequest,
19 metadata::{Metadata, MetadataStore},
20};
21
22#[derive(Debug, Clone, PartialEq, Eq, Hash)]
24pub struct Queue(Arc<str>);
25
26impl From<String> for Queue {
27 fn from(value: String) -> Self {
28 Self(Arc::from(value))
29 }
30}
31impl AsRef<str> for Queue {
32 fn as_ref(&self) -> &str {
33 &self.0
34 }
35}
36
37impl From<&str> for Queue {
38 fn from(value: &str) -> Self {
39 Self(Arc::from(value))
40 }
41}
42
43impl FromStr for Queue {
44 type Err = std::convert::Infallible;
45
46 fn from_str(s: &str) -> Result<Self, Self::Err> {
47 Ok(Self(Arc::from(s)))
48 }
49}
50
51impl std::fmt::Display for Queue {
52 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53 write!(f, "{}", self.0)
54 }
55}
56
57#[cfg(feature = "serde")]
58impl serde::Serialize for Queue {
59 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
60 where
61 S: serde::Serializer,
62 {
63 serializer.serialize_str(&self.0)
64 }
65}
66
67#[cfg(feature = "serde")]
68impl<'de> serde::Deserialize<'de> for Queue {
69 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
70 where
71 D: serde::Deserializer<'de>,
72 {
73 let s = String::deserialize(deserializer)?;
74 Ok(Self(Arc::from(s)))
75 }
76}
77
78impl<Args> FromRequest<Task<Args>> for Queue
79where
80 Args: Sync,
81{
82 type Error = QueueError;
83
84 async fn from_request(req: &Task<Args>) -> Result<Self, Self::Error> {
85 let queue = req.queue().cloned().ok_or(QueueError::NotFound)?;
86 Ok(queue)
87 }
88}
89
90#[derive(Debug, thiserror::Error)]
92#[non_exhaustive]
93pub enum QueueError {
94 #[error("Queue data not found in task context. This is likely a bug. Please report it.")]
96 NotFound,
97}
98
99impl Metadata for Queue {
100 type Error = QueueError;
101
102 fn extract(store: &MetadataStore) -> Result<Self, Self::Error> {
103 store
104 .get("queue")
105 .map(|s| Self::from(s.as_str()))
106 .ok_or(QueueError::NotFound)
107 }
108
109 fn inject(&self, map: &mut MetadataStore) -> Result<(), Self::Error> {
110 map.insert("queue", self.0.to_string())
111 .map_err(|_| QueueError::NotFound)
112 }
113}