Sha256: 779d7afad48de0b8641fc6b3cd26aed068551983b7af91f9313f97764b1ee870

Contents?: true

Size: 1.18 KB

Versions: 1

Compression:

Stored size: 1.18 KB

Contents

# frozen_string_literal: true

module RShade
  module Serializer
    class Traversal
      attr_reader :types

      def initialize(custom_types = {})
        @types = default_types.merge(custom_types)
      end

      def call(hash)
        new_val = {}
        hash.each do |name, value|
          new_val[name] = traverse(value)
        end
        new_val
      end

      def merge!(new_types)
        @types.merge!(new_types)
      end

      def default_types
        {
          default: lambda(&:to_s),
          Integer => ->(value) { value },
          Float => ->(value) { value },
          Numeric => ->(value) { value },
          String => ->(value) { value },
          Hash => lambda do |value|
            hash = {}
            value.each do |k, v|
              hash[k] = traverse(v)
            end
            hash
          end,
          Array => lambda do |value|
            value.map { |item| traverse(item) }
          end
        }
      end

      def traverse(value)
        klass = Class
        klass = value.class unless value.is_a?(Class)
        serializer = types[klass]
        serializer ||= types[:default]
        serializer.call(value)
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rshade-0.2.2 lib/rshade/serializer/traversal.rb