@@ -192,14 +192,27 @@ impl<T> fmt::Debug for Pinky<T> {
192
192
}
193
193
}
194
194
195
- /// A PinkyBroadcaster allows you to broacast a promise resolution to several subscribers.
196
- #[ must_use = "PinkyBroadcaster must be subscribed" ]
197
- pub struct PinkyBroadcaster < T : Clone > {
195
+ /// A PinkyErrorBroadcaster allows you to broacast the success/error of a promise resolution to several subscribers.
196
+ pub struct PinkyErrorBroadcaster < T , E : Clone > {
198
197
marker : Arc < RwLock < Option < String > > > ,
199
- inner : Arc < Mutex < BroadcasterInner < T > > > ,
198
+ inner : Arc < Mutex < ErrorBroadcasterInner < E > > > ,
199
+ pinky : Pinky < Result < T , E > > ,
200
200
}
201
201
202
- impl < T : Send + Clone + ' static > PinkyBroadcaster < T > {
202
+ impl < T : Send + ' static , E : Send + Clone + ' static > PinkyErrorBroadcaster < T , E > {
203
+ /// Create a new promise with associated error broadcaster
204
+ pub fn new ( ) -> ( PinkySwear < Result < T , E > > , Self ) {
205
+ let ( promise, pinky) = PinkySwear :: new ( ) ;
206
+ (
207
+ promise,
208
+ Self {
209
+ marker : Default :: default ( ) ,
210
+ inner : Arc :: new ( Mutex :: new ( ErrorBroadcasterInner ( Vec :: default ( ) ) ) ) ,
211
+ pinky,
212
+ } ,
213
+ )
214
+ }
215
+
203
216
/// Add a marker to logs
204
217
pub fn set_marker ( & self , marker : String ) {
205
218
for subscriber in self . inner . lock ( ) . 0 . iter ( ) {
@@ -209,42 +222,34 @@ impl<T: Send + Clone + 'static> PinkyBroadcaster<T> {
209
222
}
210
223
211
224
/// Subscribe to receive a broacast when the underlying promise get henoured.
212
- pub fn subscribe ( & self ) -> PinkySwear < T > {
225
+ pub fn subscribe ( & self ) -> PinkySwear < Result < ( ) , E > > {
213
226
self . inner . lock ( ) . subscribe ( self . marker . read ( ) . clone ( ) )
214
227
}
215
228
216
229
/// Unsubscribe a promise from the broadcast.
217
- pub fn unsubscribe ( & self , promise : PinkySwear < T > ) {
230
+ pub fn unsubscribe ( & self , promise : PinkySwear < Result < ( ) , E > > ) {
218
231
self . inner . lock ( ) . unsubscribe ( promise) ;
219
232
}
220
233
221
234
/// Resolve the underlying promise and broadcast the result to subscribers.
222
- pub fn swear ( & self , data : T ) {
235
+ pub fn swear ( & self , data : Result < T , E > ) {
223
236
for subscriber in self . inner . lock ( ) . 0 . iter ( ) {
224
- subscriber. swear ( data. clone ( ) )
225
- }
226
- }
227
- }
228
-
229
- impl < T : Send + Clone + ' static > Default for PinkyBroadcaster < T > {
230
- fn default ( ) -> Self {
231
- Self {
232
- marker : Default :: default ( ) ,
233
- inner : Arc :: new ( Mutex :: new ( BroadcasterInner ( Vec :: default ( ) ) ) ) ,
237
+ subscriber. swear ( data. as_ref ( ) . map ( |_| ( ) ) . map_err ( Clone :: clone) )
234
238
}
239
+ self . pinky . swear ( data) ;
235
240
}
236
241
}
237
242
238
- impl < T : Clone > fmt:: Debug for PinkyBroadcaster < T > {
243
+ impl < T , E : Clone > fmt:: Debug for PinkyErrorBroadcaster < T , E > {
239
244
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
240
- write ! ( f, "PinkyBroadcaster " )
245
+ write ! ( f, "PinkyErrorBroadcaster " )
241
246
}
242
247
}
243
248
244
- struct BroadcasterInner < T > ( Vec < Pinky < T > > ) ;
249
+ struct ErrorBroadcasterInner < E > ( Vec < Pinky < Result < ( ) , E > > > ) ;
245
250
246
- impl < T : Send + ' static > BroadcasterInner < T > {
247
- fn subscribe ( & mut self , marker : Option < String > ) -> PinkySwear < T > {
251
+ impl < E : Send + ' static > ErrorBroadcasterInner < E > {
252
+ fn subscribe ( & mut self , marker : Option < String > ) -> PinkySwear < Result < ( ) , E > > {
248
253
let ( promise, pinky) = PinkySwear :: new ( ) ;
249
254
self . 0 . push ( pinky) ;
250
255
if let Some ( marker) = marker {
@@ -253,7 +258,7 @@ impl<T: Send + 'static> BroadcasterInner<T> {
253
258
promise
254
259
}
255
260
256
- fn unsubscribe ( & mut self , promise : PinkySwear < T > ) {
261
+ fn unsubscribe ( & mut self , promise : PinkySwear < Result < ( ) , E > > ) {
257
262
self . 0 . retain ( |pinky| pinky != & promise. pinky )
258
263
}
259
264
}
0 commit comments