Module: GrapeOAS::Introspectors::DryIntrospectorSupport::ArgumentExtractor

Defined in:
lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb

Overview

Extracts typed values from Dry::Schema AST argument nodes.

Constant Summary collapse

LIST_TAGS =

AST node tags for collection predicates (included_in?, excluded_from?)

%i[list set].freeze
LITERAL_TAGS =

AST node tags for literal value wrappers

%i[value val literal class left right].freeze
PATTERN_TAGS =

AST node tags for regex patterns

%i[regexp regex].freeze

Class Method Summary collapse

Class Method Details

.extract_list(arg) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb', line 34

def extract_list(arg)
  if list_node?(arg)
    inner = arg[1]
    return RangeUtils.expand_range_to_enum(inner) if inner.is_a?(Range)

    return inner
  end
  return arg if arg.is_a?(Array)
  return RangeUtils.expand_range_to_enum(arg) if arg.is_a?(Range)

  nil
end

.extract_literal(arg) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb', line 47

def extract_literal(arg)
  return arg unless arg.is_a?(Array)
  return arg[1] if arg.length == 2 && LITERAL_TAGS.include?(arg.first)
  return extract_literal(arg.first) if arg.first.is_a?(Array)

  arg
end

.extract_numeric(arg) ⇒ Object



17
18
19
20
21
22
# File 'lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb', line 17

def extract_numeric(arg)
  return arg if arg.is_a?(Numeric)
  return arg[1] if arg.is_a?(Array) && arg.size == 2 && arg.first == :num

  nil
end

.extract_pattern(arg) ⇒ Object



55
56
57
58
59
60
61
62
63
64
# File 'lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb', line 55

def extract_pattern(arg)
  return arg.source if arg.is_a?(Regexp)

  if arg.is_a?(Array) && PATTERN_TAGS.include?(arg.first)
    return arg[1].source if arg[1].is_a?(Regexp)
    return arg[1] if arg[1].is_a?(String)
  end

  nil
end

.extract_range(arg) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb', line 24

def extract_range(arg)
  return arg if arg.is_a?(Range)
  return arg[1] if arg.is_a?(Array) && arg.first == :range
  return arg[1] if arg.is_a?(Array) && arg.first == :size && arg[1].is_a?(Range)
  # Handle [:list, range] from included_in? predicates
  return arg[1] if list_node?(arg) && arg[1].is_a?(Range)

  nil
end

.list_node?(arg) ⇒ Boolean

Helper to check if arg is a list/set AST node

Returns:

  • (Boolean)


67
68
69
# File 'lib/grape_oas/introspectors/dry_introspector_support/argument_extractor.rb', line 67

def list_node?(arg)
  arg.is_a?(Array) && LIST_TAGS.include?(arg.first)
end