Sha256: baecdbbf3d0e0cddc4adf024b862ae33fbf81a47edd667d7bc4467de94d105db

Contents?: true

Size: 1.79 KB

Versions: 5

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

require 'jimmy/schema'
require 'jimmy/schema_with_uri'

module Jimmy
  # Represents an in-memory collection of schemas
  class Index
    include Enumerable

    def initialize # rubocop:disable Style/DocumentationMethod
      @by_uri = {}
    end

    # @param [Json::URI, URI, String] uri
    # @return [Jimmy::SchemaWithURI, nil]
    def resolve(uri)
      uri = Json::URI.new(uri)
      raise Error::BadArgument, 'Cannot resolve relative URIs' if uri.relative?

      return @by_uri[uri] if @by_uri.key? uri
      return if uri.pointer.empty?

      resolve(uri / -1)&.resolve uri
    end

    alias [] resolve

    # @param [Json::URI, URI, String] uri
    # @param [Jimmy::Schema] schema
    # @return [self] self, for chaining
    def add(uri, schema)
      uri = Json::URI.new(uri)
      raise Error::BadArgument, 'Expected a schema' unless schema.is_a? Schema
      raise Error::BadArgument, 'Cannot index relative URIs' if uri.relative?

      push SchemaWithURI.new(uri, schema)
    end

    alias []= add

    # @param [Array<Jimmy::SchemaWithURI>] schemas_with_uris
    # @return [self]
    def push(*schemas_with_uris)
      schemas_with_uris.each do |schema_with_uri|
        unless schema_with_uri.is_a? SchemaWithURI
          raise Error::BadArgument, 'Expected a SchemaWithURI'
        end

        @by_uri[schema_with_uri.uri] = schema_with_uri
      end
      self
    end

    alias << push

    # @return [Array<Json::URI>]
    def uris
      @by_uri.keys
    end

    alias keys uris

    # @param [Json::URI, URI, String] uri
    # @return [true, false]
    def uri?(uri)
      !resolve(uri).nil?
    end

    alias key? uri?
    alias has_key? key?

    # @yieldparam [Jimmy::SchemaWithURI] schema_with_uri
    def each(&block)
      @by_uri.each_value &block
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
jimmy-2.1.0 lib/jimmy/index.rb
jimmy-2.0.3 lib/jimmy/index.rb
jimmy-2.0.2 lib/jimmy/index.rb
jimmy-2.0.1 lib/jimmy/index.rb
jimmy-2.0.0 lib/jimmy/index.rb