@@ -50,15 +50,12 @@ pub trait Validator<A, E, T>: Sized {
50
50
Fusion ( self . zip ( other) )
51
51
}
52
52
53
- fn trace ( self , trace : T ) -> Valid < A , E , T >
54
- where
55
- T : Clone ,
56
- {
53
+ fn trace ( self , trace : impl Into < T > + Clone ) -> Valid < A , E , T > {
57
54
let valid = self . to_result ( ) ;
58
55
if let Err ( error) = valid {
59
56
return Valid ( Err ( error
60
57
. into_iter ( )
61
- . map ( |cause| cause. trace ( trace. clone ( ) ) )
58
+ . map ( |cause| cause. trace ( trace. clone ( ) . into ( ) ) )
62
59
. collect ( ) ) ) ;
63
60
}
64
61
@@ -121,10 +118,6 @@ impl<A, E, T> Valid<A, E, T> {
121
118
Valid ( Err ( vec ! [ cause] ) )
122
119
}
123
120
124
- pub fn from ( error : Vec < Cause < E , T > > ) -> Self {
125
- Valid ( Err ( error) )
126
- }
127
-
128
121
pub fn succeed ( a : A ) -> Valid < A , E , T > {
129
122
Valid ( Ok ( a) )
130
123
}
@@ -306,9 +299,9 @@ mod tests {
306
299
#[ test]
307
300
fn test_trace ( ) {
308
301
let result = Valid :: < ( ) , i32 , String > :: fail ( 1 )
309
- . trace ( "A" . into ( ) )
310
- . trace ( "B" . into ( ) )
311
- . trace ( "C" . into ( ) ) ;
302
+ . trace ( "A" )
303
+ . trace ( "B" )
304
+ . trace ( "C" ) ;
312
305
313
306
let expected = Valid :: from ( vec ! [ Cause {
314
307
error: 1 ,
@@ -403,4 +396,20 @@ mod tests {
403
396
assert_eq ! ( result, Valid :: fail( 1 ) ) ;
404
397
assert_eq ! ( a, 0 ) ;
405
398
}
399
+
400
+ #[ test]
401
+ fn test_trace_owned_referenced ( ) {
402
+ let trace_value = "inner" . to_string ( ) ;
403
+
404
+ let valid: Valid < ( ( ) , ( ) ) , & str , String > = Valid :: fail ( "fail" )
405
+ . trace ( & trace_value)
406
+ . zip ( Valid :: fail ( "fail 2" ) . trace ( trace_value) )
407
+ . trace ( "outer" ) ;
408
+
409
+ let causes = valid. to_result ( ) . unwrap_err ( ) ;
410
+
411
+ assert_eq ! ( causes. len( ) , 2 ) ;
412
+ assert_eq ! ( causes[ 0 ] . to_string( ) , "[outer, inner] fail" ) ;
413
+ assert_eq ! ( causes[ 1 ] . to_string( ) , "[outer, inner] fail 2" ) ;
414
+ }
406
415
}
0 commit comments