Class: Lutaml::Jsonschema::ReferenceResolver

Inherits:
Object
  • Object
show all
Defined in:
lib/lutaml/jsonschema/reference_resolver.rb

Instance Method Summary collapse

Constructor Details

#initialize(schemas = {}) ⇒ ReferenceResolver

Returns a new instance of ReferenceResolver.



6
7
8
# File 'lib/lutaml/jsonschema/reference_resolver.rb', line 6

def initialize(schemas = {})
  @schemas = schemas
end

Instance Method Details

#resolve(ref, root_schema = nil) ⇒ Object



10
11
12
13
14
15
16
17
18
# File 'lib/lutaml/jsonschema/reference_resolver.rb', line 10

def resolve(ref, root_schema = nil)
  return nil unless ref

  if ref.start_with?("#/")
    resolve_local(ref, root_schema)
  else
    resolve_remote(ref)
  end
end

#resolve_local(ref, schema) ⇒ Object



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/lutaml/jsonschema/reference_resolver.rb', line 20

def resolve_local(ref, schema)
  parts = ref.delete_prefix("#/").split("/")
  current = schema

  parts.each do |part|
    case current
    when Schema
      current = navigate_schema(current, part)
    when Array
      entry = current.find { |e| e.is_a?(PropertyEntry) && e.name == part }
      current = entry&.schema
    else
      return nil
    end
    return nil unless current
  end

  current.is_a?(Schema) && current.dollar_ref ? resolve(current.dollar_ref, schema) : current
end

#resolve_remote(ref) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
# File 'lib/lutaml/jsonschema/reference_resolver.rb', line 40

def resolve_remote(ref)
  return nil unless @schemas

  if ref.include?("#")
    file_path, fragment = ref.split("#", 2)
    schema = @schemas[file_path]
    schema ? resolve_local("##{fragment}", schema) : nil
  else
    @schemas[ref]
  end
end