Skip to content

Commit f5f90ca

Browse files
authored
use impl, not macros for dict and list-like (#199)
* use impl, not macros for dict and list-like * revert dict changes * remove macro in list-like
1 parent 2e6d95b commit f5f90ca

File tree

2 files changed

+32
-43
lines changed

2 files changed

+32
-43
lines changed

src/input/return_enums.rs

Lines changed: 29 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -38,46 +38,33 @@ derive_from!(GenericListLike, FrozenSet, PyFrozenSet);
3838
derive_from!(GenericListLike, JsonArray, JsonArray);
3939
derive_from!(GenericListLike, JsonArray, [JsonInput]);
4040

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())));
7257
}
58+
Err(err) => return Err(err),
7359
}
74-
};
60+
}
61+
62+
if errors.is_empty() {
63+
Ok(output)
64+
} else {
65+
Err(ValError::LineErrors(errors))
66+
}
7567
}
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]);
8168

8269
impl<'a> GenericListLike<'a> {
8370
pub fn generic_len(&self) -> usize {
@@ -137,19 +124,19 @@ impl<'a> GenericListLike<'a> {
137124
let length = length.unwrap_or_else(|| self.generic_len());
138125
match self {
139126
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)
141128
}
142129
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)
144131
}
145132
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)
147134
}
148135
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)
150137
}
151138
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)
153140
}
154141
}
155142
}

src/validators/dict.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ macro_rules! build_validate {
9595
slots: &'data [CombinedValidator],
9696
recursion_guard: &'s mut RecursionGuard,
9797
) -> ValResult<'data, PyObject> {
98+
let mut op_len: Option<usize> = None;
9899
if let Some(min_length) = self.min_items {
99100
let input_length = dict.len();
100101
if input_length < min_length {
@@ -106,9 +107,10 @@ macro_rules! build_validate {
106107
input,
107108
));
108109
}
110+
op_len = Some(input_length);
109111
}
110112
if let Some(max_length) = self.max_items {
111-
let input_length = dict.len();
113+
let input_length = op_len.unwrap_or_else(|| dict.len());
112114
if input_length > max_length {
113115
return Err(ValError::new(
114116
ErrorKind::TooLong {

0 commit comments

Comments
 (0)