module Apigen::Formats::JsonBase

JsonBase contains the common logic for API declaration formats based on JSON Schema, such as JSON Schema itself, Swagger and OpenAPI.

Private Instance Methods

add_description(hash, description) click to toggle source
# File lib/apigen/formats/json_base.rb, line 104
def add_description(hash, description)
  hash['description'] = description unless description.nil?
end
add_example(hash, example) click to toggle source
# File lib/apigen/formats/json_base.rb, line 108
def add_example(hash, example)
  hash['example'] = example unless example.nil?
end
array_schema(api, array_type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 57
def array_schema(api, array_type)
  {
    'type' => 'array',
    'items' => schema(api, array_type.type)
  }
end
definitions(api) click to toggle source
# File lib/apigen/formats/json_base.rb, line 11
def definitions(api)
  hash = {}
  api.models.each do |key, model|
    hash[key.to_s] = schema(api, model.type, model.description, model.example)
  end
  hash
end
enum_schema(enum_type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 77
def enum_schema(enum_type)
  {
    'type' => 'string',
    'enum' => enum_type.values
  }
end
object_property(api, name, property) click to toggle source
# File lib/apigen/formats/json_base.rb, line 53
def object_property(api, name, property)
  [name.to_s, schema(api, property.type, property.description, property.example)]
end
object_schema(api, object_type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 45
def object_schema(api, object_type)
  {
    'type' => 'object',
    'properties' => object_type.properties.map { |name, property| object_property(api, name, property) }.to_h,
    'required' => object_type.properties.select { |_name, property| property.required? }.map { |name, _property| name.to_s }
  }
end
oneof_schema(oneof_type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 64
def oneof_schema(oneof_type)
  schema = {
    'oneOf' => oneof_type.mapping.keys.map { |model_name| { '$ref' => model_ref(model_name) } }
  }
  if supports_discriminator? && oneof_type.discriminator
    schema['discriminator'] = {
      'propertyName' => oneof_type.discriminator.to_s,
      'mapping' => oneof_type.mapping.map { |model_name, disc_value| [disc_value, model_ref(model_name)] }.to_h
    }
  end
  schema
end
primary_schema(primary_type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 84
def primary_schema(primary_type)
  case primary_type.shape
  when :string
    {
      'type' => 'string'
    }
  when :int32
    {
      'type' => 'integer',
      'format' => 'int32'
    }
  when :bool
    {
      'type' => 'boolean'
    }
  else
    raise "Unsupported primary type :#{primary_type.shape}."
  end
end
reference_schema(reference_type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 112
def reference_schema(reference_type)
  { '$ref' => model_ref(reference_type.model_name) }
end
schema(api, type, description = nil, example = nil) click to toggle source
# File lib/apigen/formats/json_base.rb, line 19
def schema(api, type, description = nil, example = nil)
  schema = schema_without_description(api, type)
  add_description(schema, description)
  add_example(schema, example)
  schema
end
schema_without_description(api, type) click to toggle source
# File lib/apigen/formats/json_base.rb, line 26
def schema_without_description(api, type)
  case type
  when Apigen::ObjectType
    object_schema(api, type)
  when Apigen::ArrayType
    array_schema(api, type)
  when Apigen::OneofType
    oneof_schema(type)
  when Apigen::EnumType
    enum_schema(type)
  when Apigen::PrimaryType
    primary_schema(type)
  when Apigen::ReferenceType
    reference_schema(type)
  else
    raise "Unsupported type: #{type}."
  end
end