224 lines
3.8 KiB
GDScript
224 lines
3.8 KiB
GDScript
class_name RoomValidator
|
|
|
|
|
|
static func validate(
|
|
room: RoomDefinition,
|
|
database: ProjectDatabase
|
|
) -> ValidationResult:
|
|
|
|
var result := ValidationResult.new()
|
|
|
|
if room == null:
|
|
result.add_error(
|
|
"RoomDefinition is null."
|
|
)
|
|
return result
|
|
|
|
_validate_cabinet_placements(
|
|
room,
|
|
database,
|
|
result
|
|
)
|
|
|
|
_validate_devices(
|
|
room,
|
|
result
|
|
)
|
|
|
|
_validate_bindings(
|
|
room,
|
|
database,
|
|
result
|
|
)
|
|
|
|
return result
|
|
|
|
static func _validate_cabinet_placements(
|
|
room: RoomDefinition,
|
|
database: ProjectDatabase,
|
|
result: ValidationResult
|
|
) -> void:
|
|
|
|
var seen_ids: Dictionary = {}
|
|
|
|
for placement in room.cabinet_placements:
|
|
|
|
if placement == null:
|
|
result.add_warning(
|
|
"Room contains a null cabinet placement."
|
|
)
|
|
continue
|
|
|
|
var cabinet_id := placement.cabinet_id
|
|
|
|
if cabinet_id == &"":
|
|
result.add_error(
|
|
"Room contains a cabinet placement with no cabinet_id."
|
|
)
|
|
continue
|
|
|
|
if seen_ids.has(cabinet_id):
|
|
result.add_error(
|
|
"Cabinet '%s' is placed in the room more than once."
|
|
% cabinet_id
|
|
)
|
|
else:
|
|
seen_ids[cabinet_id] = true
|
|
|
|
if database != null:
|
|
if database.get_cabinet(
|
|
cabinet_id
|
|
) == null:
|
|
|
|
result.add_error(
|
|
"Room references unknown cabinet '%s'."
|
|
% cabinet_id
|
|
)
|
|
|
|
static func _validate_devices(
|
|
room: RoomDefinition,
|
|
result: ValidationResult
|
|
) -> void:
|
|
|
|
var seen_ids: Dictionary = {}
|
|
|
|
for device in room.devices:
|
|
|
|
if device == null:
|
|
result.add_warning(
|
|
"Room contains a null device."
|
|
)
|
|
continue
|
|
|
|
if device.device_id == &"":
|
|
result.add_error(
|
|
"Room contains a device with no device_id."
|
|
)
|
|
continue
|
|
|
|
if seen_ids.has(
|
|
device.device_id
|
|
):
|
|
result.add_error(
|
|
"Room device '%s' appears more than once."
|
|
% device.device_id
|
|
)
|
|
else:
|
|
seen_ids[
|
|
device.device_id
|
|
] = true
|
|
|
|
static func _validate_bindings(
|
|
room: RoomDefinition,
|
|
database: ProjectDatabase,
|
|
result: ValidationResult
|
|
) -> void:
|
|
|
|
var seen_bindings: Dictionary = {}
|
|
|
|
for binding in room.bindings:
|
|
|
|
if binding == null:
|
|
result.add_warning(
|
|
"Room contains a null device binding."
|
|
)
|
|
continue
|
|
|
|
var cabinet_id := binding.cabinet_id
|
|
var action_id := binding.hardware_action_id
|
|
var device_id := binding.device_id
|
|
|
|
if cabinet_id == &"":
|
|
result.add_error(
|
|
"A room binding has no cabinet_id."
|
|
)
|
|
continue
|
|
|
|
if action_id == &"":
|
|
result.add_error(
|
|
"A room binding for cabinet '%s' has no hardware action."
|
|
% cabinet_id
|
|
)
|
|
continue
|
|
|
|
if device_id == &"":
|
|
result.add_error(
|
|
"A room binding for cabinet '%s' has no device_id."
|
|
% cabinet_id
|
|
)
|
|
continue
|
|
|
|
if room.get_cabinet_placement(
|
|
cabinet_id
|
|
) == null:
|
|
|
|
result.add_error(
|
|
(
|
|
"Binding references cabinet '%s', "
|
|
+ "but that cabinet is not placed in the room."
|
|
)
|
|
% cabinet_id
|
|
)
|
|
|
|
if room.get_device(
|
|
device_id
|
|
) == null:
|
|
|
|
result.add_error(
|
|
"Binding references unknown room device '%s'."
|
|
% device_id
|
|
)
|
|
|
|
var cabinet: CabinetProfile = null
|
|
|
|
if database != null:
|
|
cabinet = database.get_cabinet(
|
|
cabinet_id
|
|
)
|
|
|
|
if cabinet == null:
|
|
result.add_error(
|
|
"Binding references unknown cabinet '%s'."
|
|
% cabinet_id
|
|
)
|
|
else:
|
|
if cabinet.hardware_config == null:
|
|
result.add_error(
|
|
"Cabinet '%s' has no HardwareConfig."
|
|
% cabinet_id
|
|
)
|
|
elif not cabinet.hardware_config.has_action(
|
|
action_id
|
|
):
|
|
result.add_error(
|
|
(
|
|
"Room binding references unknown hardware action '%s' "
|
|
+ "on cabinet '%s'."
|
|
)
|
|
% [
|
|
action_id,
|
|
cabinet_id
|
|
]
|
|
)
|
|
|
|
var binding_key := (
|
|
"%s::%s::%s"
|
|
% [
|
|
cabinet_id,
|
|
action_id,
|
|
device_id
|
|
]
|
|
)
|
|
|
|
if seen_bindings.has(
|
|
binding_key
|
|
):
|
|
result.add_warning(
|
|
"Duplicate room binding '%s'."
|
|
% binding_key
|
|
)
|
|
else:
|
|
seen_bindings[
|
|
binding_key
|
|
] = true
|