@@ -3,7 +3,7 @@ use pyo3::intern;
33use pyo3:: prelude:: * ;
44use pyo3:: types:: { PyAny , PyDict } ;
55
6- use crate :: build_tools:: { function_name, kwargs , py_err, SchemaDict } ;
6+ use crate :: build_tools:: { function_name, py_err, SchemaDict } ;
77use crate :: errors:: {
88 ErrorType , LocItem , PydanticCustomError , PydanticKnownError , PydanticOmit , ValError , ValResult , ValidationError ,
99} ;
@@ -86,10 +86,10 @@ impl Validator for FunctionBeforeValidator {
8686 slots : & ' data [ CombinedValidator ] ,
8787 recursion_guard : & ' s mut RecursionGuard ,
8888 ) -> ValResult < ' data , PyObject > {
89- let kwargs = kwargs ! ( py , data : extra. data , config : self . config. clone_ref ( py ) , context : extra . context ) ;
89+ let info = ValidationInfo :: new ( extra, & self . config , py ) ;
9090 let value = self
9191 . func
92- . call ( py, ( input. to_object ( py) , ) , kwargs )
92+ . call1 ( py, ( input. to_object ( py) , info ) )
9393 . map_err ( |e| convert_err ( py, e, input) ) ?;
9494
9595 self . validator
@@ -129,8 +129,8 @@ impl Validator for FunctionAfterValidator {
129129 recursion_guard : & ' s mut RecursionGuard ,
130130 ) -> ValResult < ' data , PyObject > {
131131 let v = self . validator . validate ( py, input, extra, slots, recursion_guard) ?;
132- let kwargs = kwargs ! ( py , data : extra. data , config : self . config. clone_ref ( py ) , context : extra . context ) ;
133- self . func . call ( py, ( v, ) , kwargs ) . map_err ( |e| convert_err ( py, e, input) )
132+ let info = ValidationInfo :: new ( extra, & self . config , py ) ;
133+ self . func . call1 ( py, ( v, info ) ) . map_err ( |e| convert_err ( py, e, input) )
134134 }
135135
136136 fn get_name ( & self ) -> & str {
@@ -178,9 +178,9 @@ impl Validator for FunctionPlainValidator {
178178 _slots : & ' data [ CombinedValidator ] ,
179179 _recursion_guard : & ' s mut RecursionGuard ,
180180 ) -> ValResult < ' data , PyObject > {
181- let kwargs = kwargs ! ( py , data : extra. data , config : self . config. clone_ref ( py ) , context : extra . context ) ;
181+ let info = ValidationInfo :: new ( extra, & self . config , py ) ;
182182 self . func
183- . call ( py, ( input. to_object ( py) , ) , kwargs )
183+ . call1 ( py, ( input. to_object ( py) , info ) )
184184 . map_err ( |e| convert_err ( py, e, input) )
185185 }
186186
@@ -208,18 +208,12 @@ impl Validator for FunctionWrapValidator {
208208 slots : & ' data [ CombinedValidator ] ,
209209 recursion_guard : & ' s mut RecursionGuard ,
210210 ) -> ValResult < ' data , PyObject > {
211- let validator_kwarg = ValidatorCallable {
211+ let call_next_validator = ValidatorCallable {
212212 validator : InternalValidator :: new ( py, "ValidatorCallable" , & self . validator , slots, extra, recursion_guard) ,
213213 } ;
214- let kwargs = kwargs ! (
215- py,
216- validator: validator_kwarg,
217- data: extra. data,
218- config: self . config. clone_ref( py) ,
219- context: extra. context,
220- ) ;
214+ let info = ValidationInfo :: new ( extra, & self . config , py) ;
221215 self . func
222- . call ( py, ( input. to_object ( py) , ) , kwargs )
216+ . call1 ( py, ( input. to_object ( py) , call_next_validator , info ) )
223217 . map_err ( |e| convert_err ( py, e, input) )
224218 }
225219
@@ -303,3 +297,23 @@ pub fn convert_err<'a>(py: Python<'a>, err: PyErr, input: &'a impl Input<'a>) ->
303297 ValError :: InternalErr ( err)
304298 }
305299}
300+
301+ #[ pyclass( module = "pydantic_core._pydantic_core" ) ]
302+ pub struct ValidationInfo {
303+ #[ pyo3( get) ]
304+ data : Option < Py < PyDict > > ,
305+ #[ pyo3( get) ]
306+ config : PyObject ,
307+ #[ pyo3( get) ]
308+ context : Option < PyObject > ,
309+ }
310+
311+ impl ValidationInfo {
312+ fn new ( extra : & Extra , config : & PyObject , py : Python ) -> Self {
313+ ValidationInfo {
314+ data : extra. data . map ( |v| v. into ( ) ) ,
315+ config : config. clone_ref ( py) ,
316+ context : extra. context . map ( |v| v. into ( ) ) ,
317+ }
318+ }
319+ }
0 commit comments