@@ -38,46 +38,33 @@ derive_from!(GenericListLike, FrozenSet, PyFrozenSet);
38
38
derive_from ! ( GenericListLike , JsonArray , JsonArray ) ;
39
39
derive_from ! ( GenericListLike , JsonArray , [ JsonInput ] ) ;
40
40
41
- macro_rules! build_validate_to_vec {
42
- ( $name: ident, $list_like_type: ty) => {
43
- fn $name<' a, ' s>(
44
- py: Python <' a>,
45
- list_like: & ' a $list_like_type,
46
- length: usize ,
47
- validator: & ' s CombinedValidator ,
48
- extra: & Extra ,
49
- slots: & ' a [ CombinedValidator ] ,
50
- recursion_guard: & ' s mut RecursionGuard ,
51
- ) -> ValResult <' a, Vec <PyObject >> {
52
- let mut output: Vec <PyObject > = Vec :: with_capacity( length) ;
53
- let mut errors: Vec <ValLineError > = Vec :: new( ) ;
54
- for ( index, item) in list_like. iter( ) . enumerate( ) {
55
- match validator. validate( py, item, extra, slots, recursion_guard) {
56
- Ok ( item) => output. push( item) ,
57
- Err ( ValError :: LineErrors ( line_errors) ) => {
58
- errors. extend(
59
- line_errors
60
- . into_iter( )
61
- . map( |err| err. with_outer_location( index. into( ) ) ) ,
62
- ) ;
63
- }
64
- Err ( err) => return Err ( err) ,
65
- }
66
- }
67
-
68
- if errors. is_empty( ) {
69
- Ok ( output)
70
- } else {
71
- Err ( ValError :: LineErrors ( errors) )
41
+ fn validate_iter_to_vec < ' a , ' s > (
42
+ py : Python < ' a > ,
43
+ iter : impl Iterator < Item = & ' a ( impl Input < ' a > + ' a ) > ,
44
+ length : usize ,
45
+ validator : & ' s CombinedValidator ,
46
+ extra : & Extra ,
47
+ slots : & ' a [ CombinedValidator ] ,
48
+ recursion_guard : & ' s mut RecursionGuard ,
49
+ ) -> ValResult < ' a , Vec < PyObject > > {
50
+ let mut output: Vec < PyObject > = Vec :: with_capacity ( length) ;
51
+ let mut errors: Vec < ValLineError > = Vec :: new ( ) ;
52
+ for ( index, item) in iter. enumerate ( ) {
53
+ match validator. validate ( py, item, extra, slots, recursion_guard) {
54
+ Ok ( item) => output. push ( item) ,
55
+ Err ( ValError :: LineErrors ( line_errors) ) => {
56
+ errors. extend ( line_errors. into_iter ( ) . map ( |err| err. with_outer_location ( index. into ( ) ) ) ) ;
72
57
}
58
+ Err ( err) => return Err ( err) ,
73
59
}
74
- } ;
60
+ }
61
+
62
+ if errors. is_empty ( ) {
63
+ Ok ( output)
64
+ } else {
65
+ Err ( ValError :: LineErrors ( errors) )
66
+ }
75
67
}
76
- build_validate_to_vec ! ( validate_to_vec_list, PyList ) ;
77
- build_validate_to_vec ! ( validate_to_vec_tuple, PyTuple ) ;
78
- build_validate_to_vec ! ( validate_to_vec_set, PySet ) ;
79
- build_validate_to_vec ! ( validate_to_vec_frozenset, PyFrozenSet ) ;
80
- build_validate_to_vec ! ( validate_to_vec_jsonarray, [ JsonInput ] ) ;
81
68
82
69
impl < ' a > GenericListLike < ' a > {
83
70
pub fn generic_len ( & self ) -> usize {
@@ -137,19 +124,19 @@ impl<'a> GenericListLike<'a> {
137
124
let length = length. unwrap_or_else ( || self . generic_len ( ) ) ;
138
125
match self {
139
126
Self :: List ( list_like) => {
140
- validate_to_vec_list ( py, list_like, length, validator, extra, slots, recursion_guard)
127
+ validate_iter_to_vec ( py, list_like. iter ( ) , length, validator, extra, slots, recursion_guard)
141
128
}
142
129
Self :: Tuple ( list_like) => {
143
- validate_to_vec_tuple ( py, list_like, length, validator, extra, slots, recursion_guard)
130
+ validate_iter_to_vec ( py, list_like. iter ( ) , length, validator, extra, slots, recursion_guard)
144
131
}
145
132
Self :: Set ( list_like) => {
146
- validate_to_vec_set ( py, list_like, length, validator, extra, slots, recursion_guard)
133
+ validate_iter_to_vec ( py, list_like. iter ( ) , length, validator, extra, slots, recursion_guard)
147
134
}
148
135
Self :: FrozenSet ( list_like) => {
149
- validate_to_vec_frozenset ( py, list_like, length, validator, extra, slots, recursion_guard)
136
+ validate_iter_to_vec ( py, list_like. iter ( ) , length, validator, extra, slots, recursion_guard)
150
137
}
151
138
Self :: JsonArray ( list_like) => {
152
- validate_to_vec_jsonarray ( py, list_like, length, validator, extra, slots, recursion_guard)
139
+ validate_iter_to_vec ( py, list_like. iter ( ) , length, validator, extra, slots, recursion_guard)
153
140
}
154
141
}
155
142
}
0 commit comments