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
91
92
93
94
95
96
97
98
99
100
101
use Context as AnyhowCxt;
use DeserializeOwned;
use Deref;
use crateExtractionError;
use crateSystem;
use crate;
/// Extracts the target state for tasks created from the job handler
///
/// Allows the Job to see the desired state for the path assigned to the task.
///
/// # Example
///
/// ```rust,no_run
/// use mahler::{
/// extract::Target,
/// task::{Handler, update},
/// worker::{Worker, Ready}
/// };
/// use serde::{Serialize, Deserialize};
///
/// #[derive(Serialize,Deserialize)]
/// struct SystemState {/* ... */};
///
/// fn with_target(Target(tgt): Target<i32>) {
/// // ...
/// }
///
/// let worker: Worker<SystemState, Ready> = Worker::new()
/// .job("/{foo}/{bar}", update(with_target))
/// .initial_state(SystemState {/* ... */})
/// .unwrap();
/// ```
///
/// # Errors
///
/// Initializing the extractor will fail if the target value for the task cannot be deserialized
/// into the given type `<T>`. This includes the case where no target exists, for instance, for
/// `delete` type jobs.
///
/// ```rust,no_run
/// use mahler::{
/// extract::Target,
/// task::{Handler, delete},
/// worker::{Worker, Ready}
/// };
/// use serde::{Serialize, Deserialize};
///
/// #[derive(Serialize,Deserialize)]
/// struct SystemState {/* ... */};
///
/// // this task is applicable to `delete` operations which do not
/// // have a target, thus this extractor will always fail to be initialized
/// fn invalid_task(Target(tgt): Target<i32>) {
/// // ...
/// }
///
/// let worker: Worker<SystemState, Ready> = Worker::new()
/// // `invalid_task` will be called if a delete operation on path `/{foo}/{bar}`
/// // is required
/// .job("/{foo}/{bar}", delete(invalid_task))
/// .initial_state(SystemState {/* ... */})
/// .unwrap();
/// ```
;