1
+ use std:: marker:: PhantomData ;
2
+
1
3
use pyo3:: { PyObject , PyResult , Python } ;
2
4
3
5
use super :: Input ;
@@ -26,28 +28,30 @@ pub struct LengthConstraints {
26
28
pub max_length : Option < usize > ,
27
29
}
28
30
29
- pub struct IterableValidationChecks < ' data > {
31
+ pub struct IterableValidationChecks < ' data , I > {
30
32
output_length : usize ,
31
33
min_length : usize ,
32
34
max_length : Option < usize > ,
33
35
field_type : & ' static str ,
34
36
errors : Vec < ValLineError < ' data > > ,
37
+ p : PhantomData < I > ,
35
38
}
36
39
37
- impl < ' data > IterableValidationChecks < ' data > {
40
+ impl < ' data , I : Input < ' data > + ' data > IterableValidationChecks < ' data , I > {
38
41
pub fn new ( length_constraints : LengthConstraints , field_type : & ' static str ) -> Self {
39
42
Self {
40
43
output_length : 0 ,
41
44
min_length : length_constraints. min_length ,
42
45
max_length : length_constraints. max_length ,
43
46
field_type,
44
47
errors : vec ! [ ] ,
48
+ p : PhantomData ,
45
49
}
46
50
}
47
51
pub fn add_error ( & mut self , error : ValLineError < ' data > ) {
48
52
self . errors . push ( error)
49
53
}
50
- pub fn filter_validation_result < R , I : Input < ' data > > (
54
+ pub fn filter_validation_result < R > (
51
55
& mut self ,
52
56
result : ValResult < ' data , R > ,
53
57
input : & ' data I ,
@@ -65,18 +69,14 @@ impl<'data> IterableValidationChecks<'data> {
65
69
Err ( e) => Err ( e) ,
66
70
}
67
71
}
68
- pub fn check_output_length < I : Input < ' data > > (
69
- & mut self ,
70
- output_length : usize ,
71
- input : & ' data I ,
72
- ) -> ValResult < ' data , ( ) > {
72
+ pub fn check_output_length ( & mut self , output_length : usize , input : & ' data I ) -> ValResult < ' data , ( ) > {
73
73
self . output_length = output_length;
74
74
if let Some ( max_length) = self . max_length {
75
75
self . check_max_length ( output_length + self . errors . len ( ) , max_length, input) ?;
76
76
}
77
77
Ok ( ( ) )
78
78
}
79
- pub fn finish < I : Input < ' data > > ( & mut self , input : & ' data I ) -> ValResult < ' data , ( ) > {
79
+ pub fn finish ( & mut self , input : & ' data I ) -> ValResult < ' data , ( ) > {
80
80
if self . min_length > self . output_length {
81
81
let err = ValLineError :: new (
82
82
ErrorType :: TooShort {
@@ -94,12 +94,7 @@ impl<'data> IterableValidationChecks<'data> {
94
94
Err ( ValError :: LineErrors ( std:: mem:: take ( & mut self . errors ) ) )
95
95
}
96
96
}
97
- fn check_max_length < I : Input < ' data > > (
98
- & self ,
99
- current_length : usize ,
100
- max_length : usize ,
101
- input : & ' data I ,
102
- ) -> ValResult < ' data , ( ) > {
97
+ fn check_max_length ( & self , current_length : usize , max_length : usize , input : & ' data I ) -> ValResult < ' data , ( ) > {
103
98
if max_length < current_length {
104
99
return Err ( ValError :: new (
105
100
ErrorType :: TooLong {
@@ -115,20 +110,21 @@ impl<'data> IterableValidationChecks<'data> {
115
110
}
116
111
117
112
#[ allow( clippy:: too_many_arguments) ]
118
- pub fn validate_iterator < ' s , ' data , V , O , W , L > (
113
+ pub fn validate_iterator < ' s , ' data , V , O , W , L , I > (
119
114
py : Python < ' data > ,
120
- input : & ' data impl Input < ' data > ,
115
+ input : & ' data I ,
121
116
extra : & ' s Extra < ' s > ,
122
117
definitions : & ' data Definitions < CombinedValidator > ,
123
118
recursion_guard : & ' s mut RecursionGuard ,
124
- checks : & mut IterableValidationChecks < ' data > ,
119
+ checks : & mut IterableValidationChecks < ' data , I > ,
125
120
iter : impl Iterator < Item = ValResult < ' data , & ' data V > > ,
126
121
items_validator : & ' s CombinedValidator ,
127
122
output : & mut O ,
128
123
write : & mut W ,
129
124
len : & L ,
130
125
) -> ValResult < ' data , ( ) >
131
126
where
127
+ I : Input < ' data > + ' data ,
132
128
V : Input < ' data > + ' data ,
133
129
W : FnMut ( & mut O , PyObject ) -> PyResult < ( ) > ,
134
130
L : Fn ( & O ) -> usize ,
0 commit comments