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
|
@classmethod
|
||||||
def from_dict(cls, data: dict) -> "LoadoutConfig":
|
def from_dict(cls, data: dict) -> "LoadoutConfig":
|
||||||
"""Create LoadoutConfig from dictionary."""
|
"""Create LoadoutConfig from dictionary."""
|
||||||
|
try:
|
||||||
decimal_fields = [
|
decimal_fields = [
|
||||||
'weapon_damage', 'weapon_decay_pec', 'weapon_ammo_pec', 'weapon_dpp',
|
'weapon_damage', 'weapon_decay_pec', 'weapon_ammo_pec', 'weapon_dpp',
|
||||||
'armor_decay_pec', 'heal_cost_pec', 'heal_amount', 'protection_stab',
|
'armor_decay_pec', 'heal_cost_pec', 'heal_amount', 'protection_stab',
|
||||||
|
|
@ -324,13 +325,21 @@ class LoadoutConfig:
|
||||||
|
|
||||||
for field in decimal_fields:
|
for field in decimal_fields:
|
||||||
if field in data:
|
if field in data:
|
||||||
|
try:
|
||||||
data[field] = Decimal(data[field])
|
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
|
# Handle integer fields
|
||||||
int_fields = ['weapon_id', 'armor_id', 'shots_per_hour', 'hits_per_hour', 'heals_per_hour']
|
int_fields = ['weapon_id', 'armor_id', 'shots_per_hour', 'hits_per_hour', 'heals_per_hour']
|
||||||
for field in int_fields:
|
for field in int_fields:
|
||||||
if field in data:
|
if field in data:
|
||||||
|
try:
|
||||||
data[field] = int(data[field])
|
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
|
# Handle attachment configs
|
||||||
if 'weapon_amplifier' in data and data['weapon_amplifier']:
|
if 'weapon_amplifier' in data and data['weapon_amplifier']:
|
||||||
|
|
@ -354,9 +363,18 @@ class LoadoutConfig:
|
||||||
else:
|
else:
|
||||||
data['weapon_enhancers'] = []
|
data['weapon_enhancers'] = []
|
||||||
|
|
||||||
# Handle armor plates
|
# Handle armor plates - with validation
|
||||||
if 'armor_plates' in data and data['armor_plates']:
|
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:
|
else:
|
||||||
data['armor_plates'] = {}
|
data['armor_plates'] = {}
|
||||||
|
|
||||||
|
|
@ -383,6 +401,10 @@ class LoadoutConfig:
|
||||||
data['armor_set_name'] = '-- None --'
|
data['armor_set_name'] = '-- None --'
|
||||||
|
|
||||||
return cls(**data)
|
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