class_name SimulationDomainEvent extends RefCounted var event_id: StringName = &"" var event_type: StringName = &"" var absolute_minute := 0 var source_service: StringName = &"" var entity_ids: Array[StringName] = [] var payload: Dictionary = {} var causation_command_id := 0 func _init( p_event_id: StringName = &"", p_event_type: StringName = &"", p_absolute_minute := 0, p_source_service: StringName = &"", p_entity_ids: Array[StringName] = [], p_payload: Dictionary = {}, p_causation_command_id := 0 ) -> void: event_id = p_event_id event_type = p_event_type absolute_minute = p_absolute_minute source_service = p_source_service entity_ids = p_entity_ids.duplicate() payload = p_payload.duplicate(true) causation_command_id = p_causation_command_id func is_valid() -> bool: return not event_id.is_empty() \ and not event_type.is_empty() \ and not source_service.is_empty() \ and absolute_minute >= 0 \ and causation_command_id >= 0 func copy() -> SimulationDomainEvent: return SimulationDomainEvent.new( event_id, event_type, absolute_minute, source_service, entity_ids, payload, causation_command_id ) func to_dictionary() -> Dictionary: var saved_entity_ids: Array[String] = [] for entity_id in entity_ids: saved_entity_ids.append(String(entity_id)) return { "event_id": String(event_id), "event_type": String(event_type), "absolute_minute": absolute_minute, "source_service": String(source_service), "entity_ids": saved_entity_ids, "payload": payload.duplicate(true), "causation_command_id": causation_command_id, } static func from_dictionary(data: Dictionary) -> SimulationDomainEvent: var restored_entity_ids: Array[StringName] = [] var saved_entity_ids: Variant = data.get("entity_ids", []) if saved_entity_ids is Array: for entity_id: Variant in saved_entity_ids: restored_entity_ids.append(StringName(entity_id)) return SimulationDomainEvent.new( StringName(data.get("event_id", "")), StringName(data.get("event_type", "")), int(data.get("absolute_minute", -1)), StringName(data.get("source_service", "")), restored_entity_ids, data.get("payload", {}) as Dictionary, int(data.get("causation_command_id", 0)) )