Sha256: 07260ffdff61900a4cae60b869e85a4fa8c5fe694e229e82af9d0d937b14b6ce

Contents?: true

Size: 1.29 KB

Versions: 2

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

module Scorpio
  module OpenAPI
    module Reference
      # overrides JSI::Base#[] to implicitly dereference this Reference, except when
      # the given token is present in this Reference's instance (this should usually
      # only apply to the token '$ref')
      def [](token, **kw)
        if respond_to?(:to_hash) && !key?(token)
          deref do |deref_jsi|
            return(deref_jsi[token, **kw])
          end
        end
        return super
      end

      # yields or returns the target of this reference
      # @yield [JSI::Base] if a block is given
      # @return [JSI::Base]
      def deref
        return unless respond_to?(:to_hash) && self['$ref'].respond_to?(:to_str)

        ref_uri = Addressable::URI.parse(self['$ref'])
        ref_uri_nofrag = ref_uri.merge(fragment: nil)

        if !ref_uri_nofrag.empty? || ref_uri.fragment.nil?
          raise(NotImplementedError,
            "Scorpio currently only supports fragment URIs as OpenAPI references. cannot find reference by uri: #{self['$ref']}"
          )
        end

        ptr = JSI::Ptr.from_fragment(ref_uri.fragment)
        deref_jsi = ptr.evaluate(jsi_root_node)

        # TODO type check deref_jsi

        yield deref_jsi if block_given?

        deref_jsi
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
scorpio-0.6.4 lib/scorpio/openapi/reference.rb
scorpio-0.6.3 lib/scorpio/openapi/reference.rb