Sha256: faa69c84b370056b9ae56f51e52256d034717871b5ddc0ccc5b2fc37a7390fe4

Contents?: true

Size: 1.06 KB

Versions: 1

Compression:

Stored size: 1.06 KB

Contents

# frozen_string_literal: true

class OAPI::OpenAPI::V30::Parsers::JSON
  using OAPI::Monkey

  class << self
    def parse(input) = parse_object(input, OAPI::OpenAPI::V30::Definition)

    def parse_type(input, type)
      return input if type.nil?

      return parse_array(input, type) if type <= OAPI::Types::Array

      return parse_map(input, type) if type <= OAPI::Types::Map

      return OAPI::Ref.new(input[:$ref]) if input[:$ref]

      return type.new { input } if type <= OAPI::Schema

      return parse_object(input, type) if type <= OAPI::Types::Object

      raise ArgumentError, "unknown type #{type}"
    end

    def parse_object(input, klass)
      klass.new.tap do |obj|
        klass.properties.each do |name, type|
          value = input[name.camelize]

          obj.send(name, parse_type(value, type)) unless value.nil?
        end
      end
    end

    def parse_array(input, klass) = klass.new(input.map { parse_type(_1, klass.item_type) })
    def parse_map(input, klass) = klass.new(input.transform_values { parse_type(_1, klass.item_type) })
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
oapi-0.1.3 lib/oapi/open_api/v30/parsers/json.rb