Sha256: e7412c16f105d7e25aca4dbd5c3286ea3a0fc06b132b0d5754ace619d62628e4

Contents?: true

Size: 1.2 KB

Versions: 1

Compression:

Stored size: 1.2 KB

Contents

module JSON
  module SchemaBuilder
    class Schema
      attr_accessor :data
      delegate :[], :[]=, :to_h, :as_json, to: :data

      def initialize(hash = {})
        @data = hash.with_indifferent_access
      end

      def merge(schema)
        self.class.new _deep_merge(data, schema.data)
      end

      def merge!(schema)
        @data = _deep_merge(data, schema.data)
        self
      end

      def _deep_merge(this, other)
        this.deep_merge(other) do |current_key, this_value, other_value|
          if current_key == "anyOf"
            _deep_merge_any_of(Array(this_value), Array(other_value))
          elsif this_value.is_a?(::Array) && other_value.is_a?(::Array)
            this_value + other_value
          else
            other_value
          end
        end
      end

      def _deep_merge_any_of(this, other)
        object = self.class.new
        combined = []

        (this + other).each do |item|
          if item[:type].to_sym == :object
            object.data = object._deep_merge(object.data, item)
          else
            combined << item
          end
        end

        combined << object.data unless object.data.empty?
        combined.uniq
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
json-schema_builder-0.4.0 lib/json/schema_builder/schema.rb