[docs]defvalidate_declared_types(manifest:DatasetManifest,result:ValidationResult)->None:fortable_name,tableinmanifest.datasetTables.items():forfield_name,fieldintable.dataDictionary.items():iffield.typenotinTYPE_VALIDATORS:result.add_finding(Finding(severity="error",code="unknown_declared_type",message=(f"Field declares unknown type '{field.type}'. ""Declared types must use a supported validator keyword."),path=f"datasetTables.{table_name}.dataDictionary.{field_name}.type",table=table_name,field=field_name,rule_id="declared_type_known",hint=("Supported types: "+", ".join(sorted(TYPE_VALIDATORS.keys()))),))
[docs]defvalidate_field_value(field_name:str,field:ManifestField,value:Any,result:ValidationResult,*,table:str|None=None,row:int|None=None,path:str|None=None,)->None:ifvaluein(None,"")andfield.nullable:returnifvaluein(None,""):result.add_finding(Finding(severity="error",code="nullability_violation",message="Value is required but missing.",table=table,row=row,field=field_name,path=path,rule_id="nullable_false",))returnvalidator=TYPE_VALIDATORS.get(field.type)ifvalidatorisNone:returnifnotvalidator(value,field):result.add_finding(Finding(severity="error",code="type_validation_failed",message=f"Value '{value}' does not satisfy type '{field.type}'.",table=table,row=row,field=field_name,path=path,rule_id=f"type_{field.type}",))