Method: Modern::DocGenerator::OpenAPI3::Schemas#_build_schema_value

Defined in:
lib/modern/doc_generator/open_api3/schemas.rb

#_build_schema_value(ret, name_to_class, entry) ⇒ Object



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
# File 'lib/modern/doc_generator/open_api3/schemas.rb', line 88

def _build_schema_value(ret, name_to_class, entry)
  registered_type = @type_registry[entry]

  if !registered_type.nil?
    registered_type
  elsif entry.is_a?(Class) && entry < Dry::Struct
    _build_struct(ret, name_to_class, entry)
    _struct_ref(entry)
  elsif entry.is_a?(Dry::Types::Array::Member) && entry.options.key?(:member)
    _build_schema_value(ret, name_to_class, entry.options[:member])
  elsif entry.is_a?(Dry::Types::Sum)
    if entry.left.type.primitive == NilClass
      # it's a nullable field
      _build_schema_value(ret, name_to_class, entry.right).merge(nullable: true)
    elsif entry.right.type.primitive == NilClass
      # it's a backwards nullable field
      _build_schema_value(ret, name_to_class, entry.left).merge(nullable: true)
    else
      {
        anyOf: _flatten_any_of(
          [
            _build_schema_value(ret, name_to_class, entry.left),
            _build_schema_value(ret, name_to_class, entry.right)
          ]
        )
      }
    end
  elsif entry.is_a?(Dry::Types::Constrained)
    # TODO: dig deeper into the actual behavior of Constrained (dry-logic)
    #       This is probably a can of worms. More:
    #       http://dry-rb.org/gems/dry-types/constraints/

    _build_schema_value(ret, name_to_class, entry.type)
  elsif entry.is_a?(Dry::Types::Default) || entry.is_a?(Dry::Struct::Constructor) || entry.is_a?(Dry::Types::Constructor)
    # this just unwraps the underlying value
    _build_schema_value(ret, name_to_class, entry.type)
  elsif entry.is_a?(Dry::Types::Enum)
    _build_schema_value(ret, name_to_class, entry.type).merge(enum: entry.values)
  elsif entry.is_a?(Dry::Types::Definition)
    primitive = entry.primitive

    if primitive < Dry::Struct
      # TODO: make sure I'm understanding this correctly
      #       It feels weird to have to oneOf a $ref, but I can't figure out a
      #       syntax that doesn't require it.
      _build_struct(ret, name_to_class, primitive)

      {
        oneOf: [
          _struct_ref(primitive)
        ]
      }
    elsif primitive <= Hash
      _build_object_from_schema(ret, name_to_class, entry.member_types)
    elsif primitive <= Array
      {
        type: "array",
        items: _build_schema_value(ret, name_to_class, entry.member)
      }
    else
      raise "unrecognized primitive definition '#{primitive.name}'; probably needs a literal."
    end
  else
    raise "Unrecognized schema class: #{entry.class.name}: #{entry.inspect}"
  end
end