1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//! Traits for offering dependency injection in task functions.
//!
//! This allows for more ergonomic access to common types within the task context.
//! Items have this already implemented:
//! - [`Attempt`]
//! - [`WorkerContext`]
//! - [`Data<T>`] where T is injected via `task.data(...)`
//! - [`TaskId`]
//!
//! # Example
//!
//! Say we have a basic task for sending emails given the user id
//! ```rust
//! # use apalis_core::error::BoxDynError;
//! # struct User {
//! # id: String,
//! # // other fields...
//! # }
//! # impl User {
//! # async fn find_by_id(id: String) -> Result<Self, BoxDynError> {
//! # // Simulate fetching user from DB
//! # Ok(User { id })
//! # }
//! # }
//! struct Email {
//! user_id: String,
//! subject: String,
//! message: String
//! }
//! async fn send_email_by_id(email: Email) -> Result<(), BoxDynError> {
//! let user_id = email.user_id;
//! let user = User::find_by_id(user_id).await?;
//! // Do something with user
//!
//! Ok(())
//! }
//! ```
//!
//! With [`FromRequest`] you can improve the experience by:
//! ```rust
//! # use apalis_core::task::Task;
//! # use apalis_core::error::BoxDynError;
//! # use apalis_core::task::from_request::FromRequest;
//! # struct User {
//! # id: String,
//! # // other fields...
//! # }
//! # impl User {
//! # async fn find_by_id(id: &String) -> Result<Self, BoxDynError> {
//! # // Simulate fetching user from DB
//! # Ok(User { id: id.clone() })
//! # }
//! # }
//! # struct Email { user_id: String };
//! impl FromRequest<Task<Email>> for User {
//! type Error = BoxDynError;
//! async fn from_request(req: &Task<Email>) -> Result<Self, BoxDynError> {
//! let user_id = &req.args.user_id;
//! let user = User::find_by_id(user_id).await?;
//! Ok(user)
//! }
//! }
//!
//! async fn send_email(email: Email, user: User) -> Result<(), BoxDynError> {
//! // Do something with user
//! Ok(())
//! }
//! ```
//! [`FromRequest`]: crate::task::from_request::FromRequest
//! [`Attempt`]: crate::task::attempt::Attempt
//! [`Data<T>`]: crate::task::data::Data
//! [`WorkerContext`]: crate::worker::context::WorkerContext
//! [`TaskId`]: crate::task::task_id::TaskId
use Future;
/// A trait for extracting types from a task's context.