class ViewModel::ActiveRecord::UpdateData
def self.parse_hashes(root_subtree_hashes, referenced_subtree_hashes = {})
def self.parse_hashes(root_subtree_hashes, referenced_subtree_hashes = {}) valid_reference_keys = referenced_subtree_hashes.keys.to_set valid_reference_keys.each do |ref| unless ref.is_a?(String) raise ViewModel::DeserializationError::InvalidSyntax.new("Invalid reference string: #{ref}") end end # Construct root UpdateData root_updates = root_subtree_hashes.map do |subtree_hash| metadata = ViewModel.extract_viewmodel_metadata(subtree_hash) viewmodel_class = ViewModel::Registry.for_view_name(metadata.view_name) verify_schema_version!(viewmodel_class, metadata.schema_version, metadata.id) if metadata.schema_version UpdateData.new(viewmodel_class, metadata, subtree_hash, valid_reference_keys) end # Ensure that no root is referred to more than once check_duplicate_updates(root_updates, type: 'root') # Construct reference UpdateData referenced_updates = referenced_subtree_hashes.transform_values do |subtree_hash| metadata = ViewModel.extract_viewmodel_metadata(subtree_hash) viewmodel_class = ViewModel::Registry.for_view_name(metadata.view_name) verify_schema_version!(viewmodel_class, metadata.schema_version, metadata.id) if metadata.schema_version UpdateData.new(viewmodel_class, metadata, subtree_hash, valid_reference_keys) end check_duplicate_updates(referenced_updates.values, type: 'reference') return root_updates, referenced_updates end