Sha256: 5866ffe43cd65ebcf420bccd0d6db0fd7554c557572d04713b6a897b7876edfb

Contents?: true

Size: 1.47 KB

Versions: 9

Compression:

Stored size: 1.47 KB

Contents

module Lurker
  module Json
    class List < Schema
      def merge!(schema)
        if schema.is_a?(Array)
          schema.each { |payload| @schema[Json::ITEMS].merge!(payload) }
        else
          @schema[Json::ITEMS].merge!(schema)
        end
      end

      def replace!(property, schema)
        if @schema[Json::ITEMS].is_a?(Lurker::Json::Attribute)
          @schema[Json::ITEMS] = schema
        else
          @schema[Json::ITEMS].replace!(property, schema)
        end
      end

      private

      def initialize_default_properties(empty_items = {})
        @schema[Json::TYPE] ||= Json::ARRAY
        @schema[Json::ITEMS] ||= polymorph_items(empty_items)
      end

      def parse_schema(schema)
        @schema = {}
        schema.is_a?(Array) ? parse_array(schema.dup) : parse_hash(schema.dup)
      end

      def parse_array(schema)
        initialize_default_properties([])
        return if schema.empty?

        @schema[Json::ITEMS] = @parser.typed.parse(schema.shift)
        schema.each { |payload| @schema[Json::ITEMS].merge!(payload) }
      end

      def parse_hash(schema)
        @schema.merge!(schema)
        @schema[Json::ITEMS] = @parser.typed(polymorph_if_empty: true)
          .parse(schema.delete(Json::ITEMS) || schema)

        initialize_default_properties
      end

      def polymorph_items(schema)
        options = subschema_options.merge!(parent_property: Json::ITEMS)
        Lurker::Json::Polymorph.new(schema, options)
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
lurker-1.0.0 lib/lurker/json/schema/list.rb
lurker-0.6.12 lib/lurker/json/schema/list.rb
lurker-0.6.11 lib/lurker/json/schema/list.rb
lurker-0.6.10 lib/lurker/json/schema/list.rb
lurker-0.6.9 lib/lurker/json/schema/list.rb
lurker-0.6.8 lib/lurker/json/schema/list.rb
lurker-0.6.7 lib/lurker/json/schema/list.rb
lurker-0.6.6 lib/lurker/json/schema/list.rb
lurker-0.6.5 lib/lurker/json/schema/list.rb