Class: Liminal::Compiler

Inherits:
Object
  • Object
show all
Defined in:
lib/liminal/compiler.rb

Overview

Coordinates AST adaptation, predicate compilation, overrides, and dialect validation. Raw dry-schema AST layout is intentionally absent here.

Instance Method Summary collapse

Constructor Details

#initialize(schema, dialect:, source_name:, exclude:, overrides:, predicates:) ⇒ Compiler

Returns a new instance of Compiler.



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/liminal/compiler.rb', line 14

def initialize(schema, dialect:, source_name:, exclude:, overrides:, predicates:)
  @schema = schema
  @source_name = source_name || infer_source_name(schema)
  @dialect = build_dialect(dialect)
  @excluded_paths = normalize_exclusions(exclude)
  @overrides = normalize_overrides(overrides)
  @predicates = predicates
  validate_predicates!
  validate_path_configuration!
  @adapter = Adapters::DrySchemaV1.new
  @normalizer = Internal::Normalizer.new(source_name: @source_name)
end

Instance Method Details

#callObject



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/liminal/compiler.rb', line 27

def call
  validate_source!
  root = @adapter.call(@schema.to_ast)
  @known_paths = collect_paths(root)

  compiled = compile_node(root, [])
  check_unknown_paths!
  normalized = @normalizer.call(compiled)
  @dialect.validate!(normalized)
  @dialect.order(normalized)
rescue Dialects::OpenAPI30::InvalidFragmentError => e
  raise Error, "Compiler produced an invalid OpenAPI 3.0 schema for #{@source_name}: #{e.message}"
end