6
6
//! [`Handler`]: crate::Handler
7
7
8
8
use std:: marker:: PhantomData ;
9
+ use std:: sync:: Arc ;
9
10
use std:: task:: { Context , Poll } ;
10
11
11
12
use futures:: future:: Ready as ReadyFuture ;
@@ -63,10 +64,24 @@ impl<T> Service<T> for Sink {
63
64
#[ must_use]
64
65
#[ derive( Debug , Clone ) ]
65
66
pub struct WithState < State , Service > {
66
- state : State ,
67
+ state : Arc < State > ,
67
68
service : Service ,
68
69
}
69
70
71
+ impl < State , Srv > WithState < State , Srv > {
72
+ fn new ( state : State , service : Srv ) -> Self {
73
+ let state = Arc :: new ( state) ;
74
+ Self { state, service }
75
+ }
76
+
77
+ fn clone_state ( & self ) -> State
78
+ where
79
+ State : Clone ,
80
+ {
81
+ Arc :: unwrap_or_clone ( Arc :: clone ( & self . state ) )
82
+ }
83
+ }
84
+
70
85
impl < State , Srv > Service < Event > for WithState < State , Srv >
71
86
where
72
87
Srv : Service < ( State , Event ) > ,
82
97
83
98
#[ inline]
84
99
fn call ( & mut self , request : Event ) -> Self :: Future {
85
- self . service . call ( ( self . state . clone ( ) , request) )
100
+ self . service . call ( ( self . clone_state ( ) , request) )
86
101
}
87
102
}
88
103
@@ -101,7 +116,7 @@ where
101
116
102
117
#[ inline]
103
118
fn call ( & mut self , ( _, request) : ( OState , Event ) ) -> Self :: Future {
104
- self . service . call ( ( self . state . clone ( ) , request) )
119
+ self . service . call ( ( self . clone_state ( ) , request) )
105
120
}
106
121
}
107
122
@@ -171,10 +186,11 @@ impl<Service> Handler<Service> {
171
186
/// ```
172
187
///
173
188
/// [`Clone`]: std::clone::Clone
189
+ // TODO: State: Clone
174
190
pub fn with_state < State > ( self , state : State ) -> Handler < WithState < State , Service > > {
175
191
let Self { service, parser } = self ;
176
192
Handler {
177
- service : WithState { state, service } ,
193
+ service : WithState :: new ( state, service) ,
178
194
parser,
179
195
}
180
196
}
0 commit comments