Sha256: f5f2aabdc9459adce3f746e3367230b50b191692f9909b9a686cc5cc8d39347e

Contents?: true

Size: 1 KB

Versions: 1

Compression:

Stored size: 1 KB

Contents

module Almanack
  class SerializedTransformation

    def initialize(subject)
      @subject = subject
      @transformations = {}
    end

    def key(&block)
      @transformations[:key] = block
    end

    def value(&block)
      @transformations[:value] = block
    end

    def apply
      recurse(cloned)
    end

    private

    def cloned
      @subject.dup
    end

    def recursable?(node)
      node.is_a?(Array) || node.is_a?(Hash)
    end

    def no_change
      -> (obj) { obj }
    end

    def transformation(type, entity)
      (@transformations[type] || no_change).call(entity)
    end

    def recurse(entity)
      cloned = case entity
      when Array
        entity.map { |child| recurse(child) }
      when Hash
        entity.each_with_object({}) do |(key, value), hash|
          transformed_key = recursable?(key) ? recurse(key) : transformation(:key, key)
          hash[transformed_key] = recurse(value)
        end
      else
        transformation(:value, entity)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
almanack-1.1.0.beta1 lib/almanack/serialized_transformation.rb