fix: add error handling and validation to LoadoutConfig.from_dict
- Added try/except with logging around from_dict - Added validation for armor_plates to handle non-dict values - Added error handling for Decimal/int conversions - Better error messages to diagnose loading issues
This commit is contained in:
parent
d265bc2113
commit
fa427188d9
|
|
@ -314,6 +314,7 @@ class LoadoutConfig:
|
|||
@classmethod
|
||||
def from_dict(cls, data: dict) -> "LoadoutConfig":
|
||||
"""Create LoadoutConfig from dictionary."""
|
||||
try:
|
||||
decimal_fields = [
|
||||
'weapon_damage', 'weapon_decay_pec', 'weapon_ammo_pec', 'weapon_dpp',
|
||||
'armor_decay_pec', 'heal_cost_pec', 'heal_amount', 'protection_stab',
|
||||
|
|
@ -324,13 +325,21 @@ class LoadoutConfig:
|
|||
|
||||
for field in decimal_fields:
|
||||
if field in data:
|
||||
try:
|
||||
data[field] = Decimal(data[field])
|
||||
except Exception as e:
|
||||
logger.warning(f"Could not convert {field} to Decimal: {e}")
|
||||
data[field] = Decimal("0")
|
||||
|
||||
# Handle integer fields
|
||||
int_fields = ['weapon_id', 'armor_id', 'shots_per_hour', 'hits_per_hour', 'heals_per_hour']
|
||||
for field in int_fields:
|
||||
if field in data:
|
||||
try:
|
||||
data[field] = int(data[field])
|
||||
except Exception as e:
|
||||
logger.warning(f"Could not convert {field} to int: {e}")
|
||||
data[field] = 0
|
||||
|
||||
# Handle attachment configs
|
||||
if 'weapon_amplifier' in data and data['weapon_amplifier']:
|
||||
|
|
@ -354,9 +363,18 @@ class LoadoutConfig:
|
|||
else:
|
||||
data['weapon_enhancers'] = []
|
||||
|
||||
# Handle armor plates
|
||||
# Handle armor plates - with validation
|
||||
if 'armor_plates' in data and data['armor_plates']:
|
||||
data['armor_plates'] = {k: AttachmentConfig.from_dict(v) for k, v in data['armor_plates'].items()}
|
||||
plates = {}
|
||||
for k, v in data['armor_plates'].items():
|
||||
try:
|
||||
if isinstance(v, dict):
|
||||
plates[k] = AttachmentConfig.from_dict(v)
|
||||
else:
|
||||
logger.warning(f"Invalid armor_plate value for {k}: {type(v)}")
|
||||
except Exception as e:
|
||||
logger.error(f"Error parsing armor_plate {k}: {e}")
|
||||
data['armor_plates'] = plates
|
||||
else:
|
||||
data['armor_plates'] = {}
|
||||
|
||||
|
|
@ -383,6 +401,10 @@ class LoadoutConfig:
|
|||
data['armor_set_name'] = '-- None --'
|
||||
|
||||
return cls(**data)
|
||||
except Exception as e:
|
||||
logger.error(f"Error in LoadoutConfig.from_dict: {e}")
|
||||
logger.error(f"Data keys: {list(data.keys())}")
|
||||
raise
|
||||
|
||||
|
||||
# ============================================================================
|
||||
|
|
|
|||
Loading…
Reference in New Issue