Sha256: 56be1dd530b505a7a4ca80fe6cae41e94377b4b7bc602b681bd32347316e441e

Contents?: true

Size: 1.24 KB

Versions: 4

Compression:

Stored size: 1.24 KB

Contents

# frozen_string_literal: true

require_relative 'parser'

module BrightSerializer
  module Entity
    class Base
      DEFAULT_DEFINITION = { type: :undefined }.freeze

      # https://swagger.io/specification/v2/?sbsearch=array%20response#schema-object

      def initialize(definition)
        @definition = definition
      end

      def to_h
        @definition = Inflector.deep_transform_keys_in_object(@definition) { |k| Inflector.camel_lower k.to_s }
        parse_ref!
        evaluate_callable!
        @definition
      end

      def parse_ref!
        object = nested_hash(@definition, 'ref')
        return unless object

        ref_entity_name = Inflector.constantize(object.delete('ref')).entity_name
        relation = "#/definitions/#{ref_entity_name}"
        object['$ref'] = relation
      end

      def evaluate_callable!
        @definition = Inflector.deep_transform_values_in_object(@definition) do |value|
          value.respond_to?(:call) ? value.call : value
        end
      end

      def nested_hash(obj, key)
        if obj.respond_to?(:key?) && obj.key?(key)
          obj
        elsif obj.respond_to?(:each)
          r = nil
          obj.find { |*a| r = nested_hash(a.last, key) }
          r
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
bright_serializer-0.4.1 lib/bright_serializer/entity/base.rb
bright_serializer-0.4.0 lib/bright_serializer/entity/base.rb
bright_serializer-0.3.1 lib/bright_serializer/entity/base.rb
bright_serializer-0.3.0 lib/bright_serializer/entity/base.rb