Sha256: 694ada3faa45f9b7fed24e4f31fe84eebee598b9b278f812a2d8eb60234ab7bd

Contents?: true

Size: 1.92 KB

Versions: 95

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

require 'set'

class ReeObject::DumpAsJson
  include Ree::FnDSL

  fn :dump_as_json

  ARRAY = 'array'
  HASH = 'hash'
  PRIMITIVE = 'primitive'
  OBJECT = 'object'

  BASIC_TYPES = [
    Date, Time, Numeric, String, FalseClass, TrueClass, NilClass, Symbol,
    Module, Class
  ].freeze

  contract(
    Any => Or[Hash, ArrayOf[Any], *BASIC_TYPES]
  )
  def call(obj)
    recursively_convert(obj, {})
  end

  private

  def recursively_convert(obj, cache)
    ancestors = obj.class.ancestors

    if ancestors.intersection(BASIC_TYPES).size > 0
      {
        'type' => PRIMITIVE,
        'class' => obj.class.name,
        'value' => dump_primitive(obj)
      }
    elsif obj.is_a?(Array)
      {
        'type' => ARRAY,
        'class' => 'Array',
        'value' => obj.map { recursively_convert(_1, cache) }
      }
    elsif obj.is_a?(Hash)
      {
        'type' => HASH,
        'class' => 'Hash',
        'value' => convert_hash(obj, cache)
      }
    elsif obj.is_a?(Proc)
      raise ArgumentError, "procs are not supported"
    else
      {
        'type' => OBJECT,
        'class' => obj.class.name || (raise ArgumentError.new("anonymous classes are not supported")),
        'value' => convert_object(obj, cache)
      }
    end
  end

  PRIMITIVE_SET = Set.new([Symbol, Date, Time, DateTime, Module, Class])

  def dump_primitive(val)
    if PRIMITIVE_SET.include?(val.class)
      val.to_s
    else
      val
    end
  end

  def convert_hash(obj, cache)
    result = []

    obj.each do |k, v|
      result << [
        recursively_convert(k, cache),
        recursively_convert(v, cache),
      ]
    end

    result
  end

  def convert_object(obj, cache)
    cache[obj.object_id] = true
    result = []

    obj.instance_variables.each do |var|
      result << [
        recursively_convert(var, cache),
        recursively_convert(obj.instance_variable_get(var), cache),
      ]
    end

    result
  end
end

Version data entries

95 entries across 95 versions & 1 rubygems

Version Path
ree_lib-1.1.1 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.1.0 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.124 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.123 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.122 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.121 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.120 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.119 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.118 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.117 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.116 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.115 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.114 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.113 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.112 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.111 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.110 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.109 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.108 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb
ree_lib-1.0.107 lib/ree_lib/packages/ree_object/package/ree_object/functions/dump_as_json.rb