@@ -17,7 +17,8 @@ use pyo3::types::{PyBytes, PyComplex, PyFloat, PyFrozenSet, PyIterator, PyMappin
1717use serde:: { ser:: Error , Serialize , Serializer } ;
1818
1919use 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 ,
2122} ;
2223use crate :: py_gc:: PyGcTraverse ;
2324use crate :: tools:: { extract_i64, extract_int, new_py_string, py_err} ;
@@ -128,7 +129,9 @@ pub(crate) fn validate_iter_to_vec<'py>(
128129) -> ValResult < Vec < PyObject > > {
129130 let mut output: Vec < PyObject > = Vec :: with_capacity ( capacity) ;
130131 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 ;
132135 let item = item_result. map_err ( |e| any_next_error ! ( py, e, max_length_check. input, index) ) ?;
133136 match validator. validate ( py, item. borrow_input ( ) , state) {
134137 Ok ( item) => {
@@ -139,15 +142,15 @@ pub(crate) fn validate_iter_to_vec<'py>(
139142 max_length_check. incr ( ) ?;
140143 errors. extend ( line_errors. into_iter ( ) . map ( |err| err. with_outer_location ( index) ) ) ;
141144 if fail_fast {
142- break ;
145+ return Err ( ValError :: LineErrors ( errors ) ) ;
143146 }
144147 }
145148 Err ( ValError :: Omit ) => ( ) ,
146149 Err ( err) => return Err ( err) ,
147150 }
148151 }
149152
150- if errors. is_empty ( ) {
153+ if errors. is_empty ( ) || sequence_valid_as_partial ( state , index , & errors ) {
151154 Ok ( output)
152155 } else {
153156 Err ( ValError :: LineErrors ( errors) )
@@ -197,7 +200,9 @@ pub(crate) fn validate_iter_to_set<'py>(
197200 fail_fast : bool ,
198201) -> ValResult < ( ) > {
199202 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 ;
201206 let item = item_result. map_err ( |e| any_next_error ! ( py, e, input, index) ) ?;
202207 match validator. validate ( py, item. borrow_input ( ) , state) {
203208 Ok ( item) => {
@@ -226,11 +231,11 @@ pub(crate) fn validate_iter_to_set<'py>(
226231 Err ( err) => return Err ( err) ,
227232 }
228233 if fail_fast && !errors. is_empty ( ) {
229- break ;
234+ return Err ( ValError :: LineErrors ( errors ) ) ;
230235 }
231236 }
232237
233- if errors. is_empty ( ) {
238+ if errors. is_empty ( ) || sequence_valid_as_partial ( state , index , & errors ) {
234239 Ok ( ( ) )
235240 } else {
236241 Err ( ValError :: LineErrors ( errors) )
0 commit comments