Skip to content

Commit 33af7fa

Browse files
committed
coalesce generics
1 parent f36e34c commit 33af7fa

File tree

3 files changed

+22
-24
lines changed

3 files changed

+22
-24
lines changed

src/input/iterator.rs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::marker::PhantomData;
2+
13
use pyo3::{PyObject, PyResult, Python};
24

35
use super::Input;
@@ -26,28 +28,30 @@ pub struct LengthConstraints {
2628
pub max_length: Option<usize>,
2729
}
2830

29-
pub struct IterableValidationChecks<'data> {
31+
pub struct IterableValidationChecks<'data, I> {
3032
output_length: usize,
3133
min_length: usize,
3234
max_length: Option<usize>,
3335
field_type: &'static str,
3436
errors: Vec<ValLineError<'data>>,
37+
p: PhantomData<I>,
3538
}
3639

37-
impl<'data> IterableValidationChecks<'data> {
40+
impl<'data, I: Input<'data> + 'data> IterableValidationChecks<'data, I> {
3841
pub fn new(length_constraints: LengthConstraints, field_type: &'static str) -> Self {
3942
Self {
4043
output_length: 0,
4144
min_length: length_constraints.min_length,
4245
max_length: length_constraints.max_length,
4346
field_type,
4447
errors: vec![],
48+
p: PhantomData,
4549
}
4650
}
4751
pub fn add_error(&mut self, error: ValLineError<'data>) {
4852
self.errors.push(error)
4953
}
50-
pub fn filter_validation_result<R, I: Input<'data>>(
54+
pub fn filter_validation_result<R>(
5155
&mut self,
5256
result: ValResult<'data, R>,
5357
input: &'data I,
@@ -65,18 +69,14 @@ impl<'data> IterableValidationChecks<'data> {
6569
Err(e) => Err(e),
6670
}
6771
}
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, ()> {
7373
self.output_length = output_length;
7474
if let Some(max_length) = self.max_length {
7575
self.check_max_length(output_length + self.errors.len(), max_length, input)?;
7676
}
7777
Ok(())
7878
}
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, ()> {
8080
if self.min_length > self.output_length {
8181
let err = ValLineError::new(
8282
ErrorType::TooShort {
@@ -94,12 +94,7 @@ impl<'data> IterableValidationChecks<'data> {
9494
Err(ValError::LineErrors(std::mem::take(&mut self.errors)))
9595
}
9696
}
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, ()> {
10398
if max_length < current_length {
10499
return Err(ValError::new(
105100
ErrorType::TooLong {
@@ -115,20 +110,21 @@ impl<'data> IterableValidationChecks<'data> {
115110
}
116111

117112
#[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>(
119114
py: Python<'data>,
120-
input: &'data impl Input<'data>,
115+
input: &'data I,
121116
extra: &'s Extra<'s>,
122117
definitions: &'data Definitions<CombinedValidator>,
123118
recursion_guard: &'s mut RecursionGuard,
124-
checks: &mut IterableValidationChecks<'data>,
119+
checks: &mut IterableValidationChecks<'data, I>,
125120
iter: impl Iterator<Item = ValResult<'data, &'data V>>,
126121
items_validator: &'s CombinedValidator,
127122
output: &mut O,
128123
write: &mut W,
129124
len: &L,
130125
) -> ValResult<'data, ()>
131126
where
127+
I: Input<'data> + 'data,
132128
V: Input<'data> + 'data,
133129
W: FnMut(&mut O, PyObject) -> PyResult<()>,
134130
L: Fn(&O) -> usize,

src/validators/dict.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,20 @@ where
8888
}
8989

9090
#[allow(clippy::too_many_arguments)]
91-
fn validate_mapping<'s, 'data, K, V>(
91+
fn validate_mapping<'s, 'data, K, V, I>(
9292
py: Python<'data>,
93-
input: &'data impl Input<'data>,
93+
input: &'data I,
9494
extra: &'s Extra<'s>,
9595
definitions: &'data Definitions<CombinedValidator>,
9696
recursion_guard: &'s mut RecursionGuard,
97-
checks: &mut IterableValidationChecks<'data>,
97+
checks: &mut IterableValidationChecks<'data, I>,
9898
iter: impl Iterator<Item = ValResult<'data, (&'data K, &'data V)>>,
9999
key_validator: &'s CombinedValidator,
100100
value_validator: &'s CombinedValidator,
101101
output: &'data PyDict,
102102
) -> ValResult<'data, ()>
103103
where
104+
I: Input<'data> + 'data,
104105
K: Input<'data> + 'data,
105106
V: Input<'data> + 'data,
106107
{

src/validators/tuple.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -198,19 +198,20 @@ impl BuildValidator for TuplePositionalValidator {
198198
}
199199

200200
#[allow(clippy::too_many_arguments)]
201-
fn validate_iterator_tuple_positional<'s, 'data, V>(
201+
fn validate_iterator_tuple_positional<'s, 'data, V, I>(
202202
py: Python<'data>,
203-
input: &'data impl Input<'data>,
203+
input: &'data I,
204204
extra: &'s Extra<'s>,
205205
definitions: &'data Definitions<CombinedValidator>,
206206
recursion_guard: &'s mut RecursionGuard,
207-
checks: &mut IterableValidationChecks<'data>,
207+
checks: &mut IterableValidationChecks<'data, I>,
208208
iter: impl Iterator<Item = ValResult<'data, &'data V>>,
209209
items_validators: &[CombinedValidator],
210210
extra_validator: &Option<Box<CombinedValidator>>,
211211
output: &mut Vec<PyObject>,
212212
) -> ValResult<'data, ()>
213213
where
214+
I: Input<'data> + 'data,
214215
V: Input<'data> + 'data,
215216
{
216217
for (index, result) in iter.enumerate() {

0 commit comments

Comments
 (0)