@@ -131,12 +131,56 @@ def _config_schema_to_default_config(self, schema: dict) -> dict:
131131 """将 Schema 转换成 Config"""
132132 conf = {}
133133
134- def _parse_schema (schema : dict , conf : dict ) -> None :
135- for k , v in schema .items ():
136- if v ["type" ] not in DEFAULT_VALUE_MAP :
134+ def _is_number (value ) -> bool :
135+ return isinstance (value , int | float ) and not isinstance (value , bool )
136+
137+ def _validate_default (field : str , typ : str , default ) -> None :
138+ validators = {
139+ "int" : lambda v : isinstance (v , int ) and not isinstance (v , bool ),
140+ "float" : _is_number ,
141+ "bool" : lambda v : isinstance (v , bool ),
142+ "string" : lambda v : isinstance (v , str ),
143+ "text" : lambda v : isinstance (v , str ),
144+ "list" : lambda v : isinstance (v , list ),
145+ "file" : lambda v : isinstance (v , list ),
146+ "object" : lambda v : isinstance (v , dict ),
147+ "dict" : lambda v : isinstance (v , dict ),
148+ "template_list" : lambda v : isinstance (v , list ),
149+ }
150+ if not validators [typ ](default ):
151+ raise TypeError (f"配置项 { field } 的 default 与类型 { typ } 不匹配" )
152+
153+ def _validate_schema_item (field : str , item : dict ) -> None :
154+ typ = item ["type" ]
155+ if typ not in DEFAULT_VALUE_MAP :
156+ raise TypeError (
157+ f"不受支持的配置类型 { typ } 。支持的类型有:{ DEFAULT_VALUE_MAP .keys ()} " ,
158+ )
159+ if "options" in item and not isinstance (item ["options" ], list ):
160+ raise TypeError (f"配置项 { field } 的 options 必须是列表" )
161+ if "obvious_hint" in item and not isinstance (item ["obvious_hint" ], bool ):
162+ raise TypeError (f"配置项 { field } 的 obvious_hint 必须是布尔值" )
163+ if "slider" in item :
164+ slider = item ["slider" ]
165+ if typ not in ("int" , "float" ):
166+ raise TypeError (f"配置项 { field } 只有 int/float 类型支持 slider" )
167+ if not isinstance (slider , dict ) or not all (
168+ _is_number (slider .get (key )) for key in ("min" , "max" , "step" )
169+ ):
137170 raise TypeError (
138- f"不受支持的配置类型 { v [ 'type' ] } 。支持的类型有: { DEFAULT_VALUE_MAP . keys () } " ,
171+ f"配置项 { field } 的 slider 必须包含数字 min/max/step " ,
139172 )
173+ if typ == "object" and not isinstance (item .get ("items" ), dict ):
174+ raise TypeError (f"配置项 { field } 的 items 必须是对象" )
175+ default = item ["default" ] if "default" in item else DEFAULT_VALUE_MAP [typ ]
176+ _validate_default (field , typ , default )
177+ if typ == "object" :
178+ for child_key , child_item in item ["items" ].items ():
179+ _validate_schema_item (f"{ field } .{ child_key } " , child_item )
180+
181+ def _parse_schema (schema : dict , conf : dict ) -> None :
182+ for k , v in schema .items ():
183+ _validate_schema_item (k , v )
140184 if "default" in v :
141185 default = v ["default" ]
142186 else :
0 commit comments