@@ -17,7 +17,8 @@ use pyo3::types::{PyBytes, PyComplex, PyFloat, PyFrozenSet, PyIterator, PyMappin
17
17
use serde:: { ser:: Error , Serialize , Serializer } ;
18
18
19
19
use crate :: errors:: {
20
- py_err_string, ErrorType , ErrorTypeDefaults , InputValue , ToErrorValue , ValError , ValLineError , ValResult ,
20
+ py_err_string, sequence_valid_as_partial, ErrorType , ErrorTypeDefaults , InputValue , ToErrorValue , ValError ,
21
+ ValLineError , ValResult ,
21
22
} ;
22
23
use crate :: py_gc:: PyGcTraverse ;
23
24
use crate :: tools:: { extract_i64, extract_int, new_py_string, py_err} ;
@@ -128,7 +129,9 @@ pub(crate) fn validate_iter_to_vec<'py>(
128
129
) -> ValResult < Vec < PyObject > > {
129
130
let mut output: Vec < PyObject > = Vec :: with_capacity ( capacity) ;
130
131
let mut errors: Vec < ValLineError > = Vec :: new ( ) ;
131
- for ( index, item_result) in iter. enumerate ( ) {
132
+ let mut index = 0 ;
133
+ for item_result in iter {
134
+ index += 1 ;
132
135
let item = item_result. map_err ( |e| any_next_error ! ( py, e, max_length_check. input, index) ) ?;
133
136
match validator. validate ( py, item. borrow_input ( ) , state) {
134
137
Ok ( item) => {
@@ -139,15 +142,15 @@ pub(crate) fn validate_iter_to_vec<'py>(
139
142
max_length_check. incr ( ) ?;
140
143
errors. extend ( line_errors. into_iter ( ) . map ( |err| err. with_outer_location ( index) ) ) ;
141
144
if fail_fast {
142
- break ;
145
+ return Err ( ValError :: LineErrors ( errors ) ) ;
143
146
}
144
147
}
145
148
Err ( ValError :: Omit ) => ( ) ,
146
149
Err ( err) => return Err ( err) ,
147
150
}
148
151
}
149
152
150
- if errors. is_empty ( ) {
153
+ if errors. is_empty ( ) || sequence_valid_as_partial ( state , index , & errors ) {
151
154
Ok ( output)
152
155
} else {
153
156
Err ( ValError :: LineErrors ( errors) )
@@ -197,7 +200,9 @@ pub(crate) fn validate_iter_to_set<'py>(
197
200
fail_fast : bool ,
198
201
) -> ValResult < ( ) > {
199
202
let mut errors: Vec < ValLineError > = Vec :: new ( ) ;
200
- for ( index, item_result) in iter. enumerate ( ) {
203
+ let mut index = 0 ;
204
+ for item_result in iter {
205
+ index += 1 ;
201
206
let item = item_result. map_err ( |e| any_next_error ! ( py, e, input, index) ) ?;
202
207
match validator. validate ( py, item. borrow_input ( ) , state) {
203
208
Ok ( item) => {
@@ -226,11 +231,11 @@ pub(crate) fn validate_iter_to_set<'py>(
226
231
Err ( err) => return Err ( err) ,
227
232
}
228
233
if fail_fast && !errors. is_empty ( ) {
229
- break ;
234
+ return Err ( ValError :: LineErrors ( errors ) ) ;
230
235
}
231
236
}
232
237
233
- if errors. is_empty ( ) {
238
+ if errors. is_empty ( ) || sequence_valid_as_partial ( state , index , & errors ) {
234
239
Ok ( ( ) )
235
240
} else {
236
241
Err ( ValError :: LineErrors ( errors) )
0 commit comments