Sha256: 67fa79fd10b208ad610273cb7b78334d11378cf1ca6bde3343511f388ca90c9f

Contents?: true

Size: 1.87 KB

Versions: 12

Compression:

Stored size: 1.87 KB

Contents

module EventSourcery
  # EventBodySerializer is used for serializing event bodies when persisting events.
  class EventBodySerializer
    # Serialize the given event body, with the default or the provided, serializer
    #
    # @param event_body event body to be serialized
    # @param serializer Optional. Serializer to be used. By default {Config#event_body_serializer EventSourcery.config.event_body_serializer} will be used.
    def self.serialize(event_body,
                       serializer: EventSourcery.config.event_body_serializer)
      serializer.serialize(event_body)
    end

    def initialize
      @serializers = Hash.new(IdentitySerializer)
    end

    # Register a serializer (instance or block) for the specified type
    #
    # @param type The type for which the provided serializer will be used for
    # @param serializer Optional. A serializer instance for the given type
    # @param block_serializer [Proc] Optional. A block that performs the serialization
    def add(type, serializer = nil, &block_serializer)
      @serializers[type] = serializer || block_serializer
      self
    end

    # Serialize the given event body
    #
    # @param object event body to be serialized
    def serialize(object)
      serializer = @serializers[object.class]
      serializer.call(object, &method(:serialize))
    end

    # Default serializer for Hash objects
    module HashSerializer
      def self.call(hash, &serialize)
        hash.each_with_object({}) do |(key, value), memo|
          memo[key.to_s] = serialize.call(value)
        end
      end
    end

    # Default serializer for Array objects
    module ArraySerializer
      def self.call(array, &serialize)
        array.map(&serialize)
      end
    end

    # Default catch all implementation for serializing any object
    module IdentitySerializer
      def self.call(object)
        object
      end
    end
  end
end

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
event_sourcery-1.0.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.24.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.23.1 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.23.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.22.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.21.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.20.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.19.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.18.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.17.0 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.16.1 lib/event_sourcery/event_body_serializer.rb
event_sourcery-0.15.0 lib/event_sourcery/event_body_serializer.rb