Skip to content

Commit 4c08142

Browse files
committed
Remaining work
1 parent 8148d18 commit 4c08142

File tree

4 files changed

+58
-9
lines changed

4 files changed

+58
-9
lines changed

src/input/input_abstract.rs

+4
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ pub trait ValidatedList<'py> {
267267
pub trait ValidatedTuple<'py> {
268268
type Item: BorrowInput<'py>;
269269
fn len(&self) -> Option<usize>;
270+
fn try_for_each(self, f: impl FnMut(PyResult<Self::Item>) -> ValResult<()>) -> ValResult<()>;
270271
fn iterate<R>(self, consumer: impl ConsumeIterator<PyResult<Self::Item>, Output = R>) -> ValResult<R>;
271272
}
272273

@@ -315,6 +316,9 @@ impl<'py> ValidatedTuple<'py> for Never {
315316
fn len(&self) -> Option<usize> {
316317
unreachable!()
317318
}
319+
fn try_for_each(self, _f: impl FnMut(PyResult<Self::Item>) -> ValResult<()>) -> ValResult<()> {
320+
unreachable!()
321+
}
318322
fn iterate<R>(self, _consumer: impl ConsumeIterator<PyResult<Self::Item>, Output = R>) -> ValResult<R> {
319323
unreachable!()
320324
}

src/input/input_json.rs

+6
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,12 @@ impl<'a, 'data> ValidatedTuple<'_> for &'a JsonArray<'data> {
581581
fn len(&self) -> Option<usize> {
582582
Some(SmallVec::len(self))
583583
}
584+
fn try_for_each(self, mut f: impl FnMut(PyResult<Self::Item>) -> ValResult<()>) -> ValResult<()> {
585+
for item in self.iter() {
586+
f(Ok(item))?;
587+
}
588+
Ok(())
589+
}
584590
fn iterate<R>(self, consumer: impl ConsumeIterator<PyResult<Self::Item>, Output = R>) -> ValResult<R> {
585591
Ok(consumer.consume_iterator(self.iter().map(Ok)))
586592
}

src/input/input_python.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -925,7 +925,15 @@ impl<'py> PySequenceIterable<'_, 'py> {
925925
PySequenceIterable::Iterator(iter) => iter.len().ok(),
926926
}
927927
}
928-
928+
fn generic_try_for_each(self, f: impl FnMut(PyResult<Bound<'py, PyAny>>) -> ValResult<()>) -> ValResult<()> {
929+
match self {
930+
PySequenceIterable::List(iter) => iter.iter().map(Ok).try_for_each(f),
931+
PySequenceIterable::Tuple(iter) => iter.iter().map(Ok).try_for_each(f),
932+
PySequenceIterable::Set(iter) => iter.iter().map(Ok).try_for_each(f),
933+
PySequenceIterable::FrozenSet(iter) => iter.iter().map(Ok).try_for_each(f),
934+
PySequenceIterable::Iterator(mut iter) => iter.try_for_each(f),
935+
}
936+
}
929937
fn generic_iterate<R>(
930938
self,
931939
consumer: impl ConsumeIterator<PyResult<Bound<'py, PyAny>>, Output = R>,
@@ -961,6 +969,9 @@ impl<'py> ValidatedTuple<'py> for PySequenceIterable<'_, 'py> {
961969
fn len(&self) -> Option<usize> {
962970
self.generic_len()
963971
}
972+
fn try_for_each(self, f: impl FnMut(PyResult<Self::Item>) -> ValResult<()>) -> ValResult<()> {
973+
self.generic_try_for_each(f)
974+
}
964975
fn iterate<R>(self, consumer: impl ConsumeIterator<PyResult<Self::Item>, Output = R>) -> ValResult<R> {
965976
self.generic_iterate(consumer)
966977
}

src/validators/arguments_v3.rs

+36-8
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ use pyo3::IntoPyObjectExt;
1010
use crate::build_tools::py_schema_err;
1111
use crate::build_tools::{schema_or_config_same, ExtraBehavior};
1212
use crate::errors::{ErrorTypeDefaults, ValError, ValLineError, ValResult};
13-
use crate::input::{Arguments, BorrowInput, Input, KeywordArgs, PositionalArgs, ValidatedDict, ValidationMatch};
13+
use crate::input::{
14+
Arguments, BorrowInput, Input, KeywordArgs, PositionalArgs, ValidatedDict, ValidatedTuple, ValidationMatch,
15+
};
1416
use crate::lookup_key::LookupKey;
1517
use crate::tools::SchemaDict;
1618

@@ -209,11 +211,29 @@ impl ArgumentsV3Validator {
209211
Err(err) => return Err(err),
210212
}
211213
}
212-
// ParameterMode::VarArgs => match dict_value.validate_tuple() {
213-
// Ok(iterable) => for value in iterable,
214-
// Err(err) => return Err(err),
215-
// },
216-
ParameterMode::VarArgs => todo!(),
214+
ParameterMode::VarArgs => match dict_value.borrow_input().validate_tuple(false) {
215+
Ok(tuple) => {
216+
tuple.unpack(state).try_for_each(|v| {
217+
match parameter.validator.validate(py, v.unwrap().borrow_input(), state) {
218+
Ok(tuple_value) => {
219+
output_args.push(tuple_value);
220+
return Ok(());
221+
}
222+
Err(ValError::LineErrors(line_errors)) => {
223+
errors.extend(line_errors.into_iter().map(|err| {
224+
lookup_path.apply_error_loc(err, self.loc_by_alias, &parameter.name)
225+
}));
226+
return Ok(());
227+
}
228+
Err(err) => return Err(err),
229+
}
230+
})?;
231+
}
232+
Err(_) => {
233+
let val_error = ValLineError::new(ErrorTypeDefaults::TupleType, dict_value.borrow_input());
234+
errors.push(lookup_path.apply_error_loc(val_error, self.loc_by_alias, &parameter.name));
235+
}
236+
},
217237
ParameterMode::KeywordOnly => {
218238
match parameter.validator.validate(py, dict_value.borrow_input(), state) {
219239
Ok(value) => {
@@ -240,6 +260,7 @@ impl ArgumentsV3Validator {
240260
for err in line_errors {
241261
errors.push(
242262
err.with_outer_location(dict_key.clone())
263+
.with_outer_location(&parameter.name)
243264
.with_type(ErrorTypeDefaults::InvalidKey),
244265
);
245266
}
@@ -252,14 +273,21 @@ impl ArgumentsV3Validator {
252273
Ok(value) => output_kwargs.set_item(dict_key, value)?,
253274
Err(ValError::LineErrors(line_errors)) => {
254275
errors.extend(line_errors.into_iter().map(|err| {
255-
lookup_path.apply_error_loc(err, self.loc_by_alias, &parameter.name)
276+
lookup_path.apply_error_loc(
277+
err.with_outer_location(dict_key.clone()),
278+
self.loc_by_alias,
279+
&parameter.name,
280+
)
256281
}));
257282
}
258283
Err(err) => return Err(err),
259284
}
260285
}
261286
}
262-
None => todo!(),
287+
None => {
288+
let val_error = ValLineError::new(ErrorTypeDefaults::DictType, dict_value);
289+
errors.push(lookup_path.apply_error_loc(val_error, self.loc_by_alias, &parameter.name));
290+
}
263291
},
264292
ParameterMode::VarKwargsUnpackedTypedDict => {
265293
let kwargs_dict = dict_value

0 commit comments

Comments
 (0)