class LazyApiDoc::VariantsParser

Constants

OPTIONAL

Attributes

variants[R]

Public Class Methods

new(variants) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 6
def initialize(variants)
  @variants = variants.is_a?(Array) ? variants : [variants]
end

Public Instance Methods

parse(variant, variants) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 14
def parse(variant, variants)
  variants.delete(OPTIONAL)
  case variant
  when Array
    parse_array(variant, variants)
  when Hash
    parse_hash(variants)
  else
    types_template(variants).merge("example" => variant)
  end
end
parse_array(variant, variants) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 83
def parse_array(variant, variants)
  first = variant.first
  types_template(variants).merge(
    "items"   => parse(first, variants.compact.map(&:first).compact),
    "example" => variant
  )
end
parse_hash(variants) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 69
def parse_hash(variants)
  result = types_template(variants)
  variant = variants.select { |v| v.is_a?(Hash) }.reverse_each
                    .each_with_object({}) { |v, res| res.merge!(v) }
  result["properties"] = variant.map do |key, val|
    [
      key.to_s,
      parse(val, variants.compact.map { |v| v.fetch(key, OPTIONAL) })
    ]
  end.to_h
  result["required"] = variant.keys.select { |key| variants.compact.all? { |v| v.key?(key) } }
  result
end
result() click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 10
def result
  @result ||= parse(variants.first, variants)
end
type_of(variant) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 43
def type_of(variant)
  case variant
  when Hash
    "object"
  when NilClass
    "null"
  when TrueClass, FalseClass
    "boolean"
  when String
    type_of_string(variant)
  when Float
    'number'
  else
    variant.class.name.downcase
  end
end
type_of_string(variant) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 60
def type_of_string(variant)
  case variant
  when /\A\d+\.\d+\z/
    "decimal"
  else
    "string"
  end
end
types_of(variants) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 39
def types_of(variants)
  variants.map { |v| type_of(v) }.uniq
end
types_template(variants) click to toggle source
# File lib/lazy_api_doc/variants_parser.rb, line 26
def types_template(variants)
  types = types_of(variants)
  if types.count == 1
    {
      "type" => types.first
    }
  else
    {
      "oneOf" => types.map { |t| { "type" => t } }
    }
  end
end