@@ -12,15 +12,15 @@ use crate::errors::LocItem;
1212use crate :: errors:: { ErrorType , ErrorTypeDefaults , ValError , ValLineError , ValResult } ;
1313use crate :: input:: ConsumeIterator ;
1414use crate :: input:: { BorrowInput , Input , ValidatedDict , ValidationMatch } ;
15- use crate :: lookup_key:: get_lookup_key ;
15+ use crate :: lookup_key:: LookupKeyCollection ;
1616use crate :: tools:: SchemaDict ;
1717
1818use super :: { build_validator, BuildValidator , CombinedValidator , DefinitionsBuilder , ValidationState , Validator } ;
1919
2020#[ derive( Debug ) ]
2121struct Field {
2222 name : String ,
23- alias : Option < Py < PyAny > > ,
23+ lookup_key_collection : LookupKeyCollection ,
2424 name_py : Py < PyString > ,
2525 validator : CombinedValidator ,
2626 frozen : bool ,
@@ -52,9 +52,11 @@ impl BuildValidator for ModelFieldsValidator {
5252 let py = schema. py ( ) ;
5353
5454 let strict = is_strict ( schema, config) ?;
55- let extra_behavior = ExtraBehavior :: from_schema_or_config ( py , schema , config , ExtraBehavior :: Ignore ) ? ;
55+
5656 let from_attributes = schema_or_config_same ( schema, config, intern ! ( py, "from_attributes" ) ) ?. unwrap_or ( false ) ;
5757
58+ let extra_behavior = ExtraBehavior :: from_schema_or_config ( py, schema, config, ExtraBehavior :: Ignore ) ?;
59+
5860 let extras_validator = match ( schema. get_item ( intern ! ( py, "extras_schema" ) ) ?, & extra_behavior) {
5961 ( Some ( v) , ExtraBehavior :: Allow ) => Some ( Box :: new ( build_validator ( & v, config, definitions) ?) ) ,
6062 ( Some ( _) , _) => return py_schema_err ! ( "extras_schema can only be used if extra_behavior=allow" ) ,
@@ -79,11 +81,12 @@ impl BuildValidator for ModelFieldsValidator {
7981 Err ( err) => return py_schema_err ! ( "Field \" {}\" :\n {}" , field_name, err) ,
8082 } ;
8183
84+ let validation_alias = field_info. get_item ( intern ! ( py, "validation_alias" ) ) ?;
85+ let lookup_key_collection = LookupKeyCollection :: new ( py, validation_alias, field_name) ?;
86+
8287 fields. push ( Field {
8388 name : field_name. to_string ( ) ,
84- alias : field_info
85- . get_item ( intern ! ( py, "validation_alias" ) ) ?
86- . map ( std:: convert:: Into :: into) ,
89+ lookup_key_collection,
8790 name_py : field_name_py. into ( ) ,
8891 validator,
8992 frozen : field_info. get_as :: < bool > ( intern ! ( py, "frozen" ) ) ?. unwrap_or ( false ) ,
@@ -157,7 +160,7 @@ impl Validator for ModelFieldsValidator {
157160
158161 // we only care about which keys have been used if we're iterating over the object for extra after
159162 // the first pass
160- let mut used_keys: Option < AHashSet < String > > =
163+ let mut used_keys: Option < AHashSet < & str > > =
161164 if self . extra_behavior == ExtraBehavior :: Ignore || dict. is_py_get_attr ( ) {
162165 None
163166 } else {
@@ -168,14 +171,10 @@ impl Validator for ModelFieldsValidator {
168171 let state = & mut state. rebind_extra ( |extra| extra. data = Some ( model_dict. clone ( ) ) ) ;
169172
170173 for field in & self . fields {
171- let lookup_key = get_lookup_key (
172- py,
173- field. alias . as_ref ( ) ,
174- validate_by_name,
175- validate_by_alias,
176- & field. name ,
177- ) ?;
178- let op_key_value = match dict. get_item ( & lookup_key) {
174+ let lookup_key = field
175+ . lookup_key_collection
176+ . select ( validate_by_alias, validate_by_name) ?;
177+ let op_key_value = match dict. get_item ( lookup_key) {
179178 Ok ( v) => v,
180179 Err ( ValError :: LineErrors ( line_errors) ) => {
181180 for err in line_errors {
@@ -189,7 +188,7 @@ impl Validator for ModelFieldsValidator {
189188 if let Some ( ref mut used_keys) = used_keys {
190189 // key is "used" whether or not validation passes, since we want to skip this key in
191190 // extra logic either way
192- used_keys. insert ( lookup_path. first_key ( ) . to_string ( ) ) ;
191+ used_keys. insert ( lookup_path. first_key ( ) ) ;
193192 }
194193 match field. validator . validate ( py, value. borrow_input ( ) , state) {
195194 Ok ( value) => {
@@ -240,7 +239,7 @@ impl Validator for ModelFieldsValidator {
240239 if let Some ( used_keys) = used_keys {
241240 struct ValidateToModelExtra < ' a , ' s , ' py > {
242241 py : Python < ' py > ,
243- used_keys : AHashSet < String > ,
242+ used_keys : AHashSet < & ' a str > ,
244243 errors : & ' a mut Vec < ValLineError > ,
245244 fields_set_vec : & ' a mut Vec < Py < PyString > > ,
246245 extra_behavior : ExtraBehavior ,
0 commit comments