@@ -78,7 +78,7 @@ impl<T, C, E> ValueType for Option<T>
78
78
where
79
79
T : for < ' a > FromValue < ' a , Checker = C > + ValueTypeOptional + StaticType + ' static ,
80
80
C : ValueTypeChecker < Error = ValueTypeMismatchOrNoneError < E > > ,
81
- E : error:: Error ,
81
+ E : error:: Error + Send + Sized + ' static ,
82
82
{
83
83
type Type = T :: Type ;
84
84
}
@@ -280,7 +280,7 @@ impl<'a, T, C, E> FromValueOptional<'a> for T
280
280
where
281
281
T : FromValue < ' a , Checker = C > ,
282
282
C : ValueTypeChecker < Error = ValueTypeMismatchOrNoneError < E > > ,
283
- E : error:: Error ,
283
+ E : error:: Error + Send + Sized + ' static ,
284
284
{
285
285
}
286
286
@@ -291,26 +291,50 @@ mod private {
291
291
where
292
292
T : super :: FromValue < ' a , Checker = C > ,
293
293
C : super :: ValueTypeChecker < Error = super :: ValueTypeMismatchOrNoneError < E > > ,
294
- E : super :: error:: Error ,
294
+ E : super :: error:: Error + Send + Sized + ' static ,
295
295
{
296
296
}
297
297
}
298
298
299
+ // rustdoc-stripper-ignore-next
300
+ /// Wrapped `Value` type checker for optional types.
301
+ pub struct ValueTypeOrNoneChecker < T , C , E > ( std:: marker:: PhantomData < ( T , C , E ) > ) ;
302
+
303
+ unsafe impl < ' a , T , C , E > ValueTypeChecker for ValueTypeOrNoneChecker < T , C , E >
304
+ where
305
+ T : FromValue < ' a , Checker = C > + StaticType ,
306
+ C : ValueTypeChecker < Error = ValueTypeMismatchOrNoneError < E > > ,
307
+ E : error:: Error + Send + Sized + ' static ,
308
+ {
309
+ type Error = E ;
310
+
311
+ fn check ( value : & Value ) -> Result < ( ) , Self :: Error > {
312
+ match T :: Checker :: check ( value) {
313
+ Err ( ValueTypeMismatchOrNoneError :: UnexpectedNone ) => Ok ( ( ) ) ,
314
+ Err ( ValueTypeMismatchOrNoneError :: WrongValueType ( err) ) => Err ( err) ,
315
+ Ok ( _) => Ok ( ( ) ) ,
316
+ }
317
+ }
318
+ }
319
+
299
320
// rustdoc-stripper-ignore-next
300
321
/// Blanket implementation for all optional types.
301
322
unsafe impl < ' a , T , C , E > FromValue < ' a > for Option < T >
302
323
where
303
324
T : FromValue < ' a , Checker = C > + StaticType ,
304
325
C : ValueTypeChecker < Error = ValueTypeMismatchOrNoneError < E > > ,
305
- E : error:: Error ,
326
+ E : error:: Error + Send + Sized + ' static ,
306
327
{
307
- type Checker = GenericValueTypeChecker < T > ;
328
+ type Checker = ValueTypeOrNoneChecker < T , C , E > ;
308
329
309
330
unsafe fn from_value ( value : & ' a Value ) -> Self {
310
- if let Err ( ValueTypeMismatchOrNoneError :: UnexpectedNone ) = T :: Checker :: check ( value) {
311
- None
312
- } else {
313
- Some ( T :: from_value ( value) )
331
+ match T :: Checker :: check ( value) {
332
+ Err ( ValueTypeMismatchOrNoneError :: UnexpectedNone ) => None ,
333
+ Err ( ValueTypeMismatchOrNoneError :: WrongValueType ( _err) ) => {
334
+ // This should've been caught by the caller already.
335
+ unreachable ! ( ) ;
336
+ }
337
+ Ok ( _) => Some ( T :: from_value ( value) ) ,
314
338
}
315
339
}
316
340
}
0 commit comments