class RubyEventStore::Mappers::Transformation::PreserveTypes

Constants

DEFAULT_STORE_TYPE

Attributes

registry[R]

Public Class Methods

new(type_resolver: ->(type) { type.to_s } click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 7
def initialize(type_resolver: ->(type) { type.to_s })
  @registry = Registry.new(type_resolver)
end

Public Instance Methods

dump(record) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 68
def dump(record)
  data = transform(record.data)
  metadata = transform(record.metadata)
  if (metadata.respond_to?(:[]=))
    metadata[:types] = { data: store_type(record.data), metadata: store_type(record.metadata) }
  end

  Record.new(
    event_id: record.event_id,
    event_type: record.event_type,
    data: data,
    metadata: metadata,
    timestamp: record.timestamp,
    valid_at: record.valid_at
  )
end
load(record) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 85
def load(record)
  types =
    begin
      record.metadata.delete(:types)
    rescue StandardError
      nil
    end
  data_types = types&.fetch(:data, nil)
  metadata_types = types&.fetch(:metadata, nil)
  data = restore_type(record.data, data_types)
  metadata = restore_type(record.metadata, metadata_types)

  Record.new(
    event_id: record.event_id,
    event_type: record.event_type,
    data: data,
    metadata: metadata,
    timestamp: record.timestamp,
    valid_at: record.valid_at
  )
end
register(type, serializer:, deserializer:, stored_type: DEFAULT_STORE_TYPE) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 63
def register(type, serializer:, deserializer:, stored_type: DEFAULT_STORE_TYPE)
  registry.add(type, serializer, deserializer, stored_type)
  self
end

Private Instance Methods

restore_type(argument, type) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 153
def restore_type(argument, type)
  case type
  when Hash
    restore_types(argument, type)
  when Array
    argument.each_with_index.map { |a, idx| restore_type(a, type.fetch(idx)) }
  else
    registry.of(type).deserializer[argument]
  end
end
restore_types(argument, types) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 145
def restore_types(argument, types)
  argument.each_with_object({}) do |(key, value), hash|
    key_type, value_type = types.fetch(key.to_sym) { types.fetch(key.to_s) }
    restored_key = restore_type(key, key_type)
    hash[restored_key] = restore_type(value, value_type)
  end
end
store_type(argument) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 134
def store_type(argument)
  case argument
  when Hash
    store_types(argument)
  when Array
    argument.map { |i| store_type(i) }
  else
    registry.of(argument.class).stored_type[argument]
  end
end
store_types(argument) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 128
def store_types(argument)
  argument.each_with_object({}) do |(key, value), hash|
    hash[transform(key)] = [store_type(key), store_type(value)]
  end
end
transform(argument) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 117
def transform(argument)
  case argument
  when Hash
    transform_hash(argument)
  when Array
    argument.map { |i| transform(i) }
  else
    registry.of(argument.class).serializer[argument]
  end
end
transform_hash(argument) click to toggle source
# File lib/ruby_event_store/mappers/transformation/preserve_types.rb, line 113
def transform_hash(argument)
  argument.each_with_object({}) { |(key, value), hash| hash[transform(key)] = transform(value) }
end