apalis_core/task/
attempt.rs1use std::{
10 convert::Infallible,
11 sync::{Arc, atomic::AtomicUsize},
12};
13
14use crate::{task::Task, task_fn::FromRequest};
15
16#[derive(Debug, Clone)]
18pub struct Attempt(Arc<AtomicUsize>);
19
20impl Default for Attempt {
21 fn default() -> Self {
22 Self(Arc::new(AtomicUsize::new(0)))
23 }
24}
25
26impl Attempt {
27 #[must_use]
29 pub fn new() -> Self {
30 Self::default()
31 }
32
33 #[must_use]
35 pub fn new_with_value(value: usize) -> Self {
36 Self(Arc::new(AtomicUsize::from(value)))
37 }
38
39 #[must_use]
41 pub fn current(&self) -> usize {
42 self.0.load(std::sync::atomic::Ordering::Relaxed)
43 }
44
45 #[must_use]
47 pub fn increment(&self) -> usize {
48 self.0.fetch_add(1, std::sync::atomic::Ordering::Relaxed)
49 }
50}
51
52impl<Args: Sync, Ctx: Sync, IdType: Sync + Send> FromRequest<Task<Args, Ctx, IdType>> for Attempt {
53 type Error = Infallible;
54 async fn from_request(task: &Task<Args, Ctx, IdType>) -> Result<Self, Self::Error> {
55 Ok(task.parts.attempt.clone())
56 }
57}
58
59#[cfg(feature = "serde")]
60mod serde_impl {
61 use std::sync::atomic::Ordering;
62
63 use serde::{Deserialize, Deserializer, Serialize, Serializer};
64
65 use super::*;
66
67 fn serialize<S>(attempt: &Attempt, serializer: S) -> Result<S::Ok, S::Error>
69 where
70 S: Serializer,
71 {
72 let value = attempt.0.load(Ordering::SeqCst);
73 serializer.serialize_u64(value as u64)
74 }
75
76 fn deserialize<'de, D>(deserializer: D) -> Result<Attempt, D::Error>
78 where
79 D: Deserializer<'de>,
80 {
81 let value = u64::deserialize(deserializer)?;
82 Ok(Attempt(Arc::new(AtomicUsize::new(value as usize))))
83 }
84
85 impl Serialize for Attempt {
86 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
87 where
88 S: Serializer,
89 {
90 serialize(self, serializer)
91 }
92 }
93
94 impl<'de> Deserialize<'de> for Attempt {
95 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
96 where
97 D: Deserializer<'de>,
98 {
99 deserialize(deserializer)
100 }
101 }
102}