class SoberSwag::Reporting::Input::Object

Input object values

Attributes

fields[R]

@return [Hash<String,#call>]

Public Class Methods

new(fields) click to toggle source

@param fields [Hash<Symbol, Property>]

# File lib/sober_swag/reporting/input/object.rb, line 10
def initialize(fields)
  @fields = fields
end

Public Instance Methods

call(value) click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 18
def call(value)
  return Report::Value.new(['was a not a JSON object']) unless value.is_a?(Hash)

  bad, good = fields.map { |k, prop|
    extract_value(k, prop, value)
  }.compact.partition { |(_, v)| v.is_a?(Report::Base) }

  return Report::Object.new(bad.to_h) if bad.any?

  good.to_h
end
swagger_path_schema() click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 47
def swagger_path_schema
  swagger_parameter_schema.map do |param|
    param.merge({ in: :path })
  end
end
swagger_query_schema() click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 41
def swagger_query_schema
  swagger_parameter_schema.map do |param|
    param.merge({ in: :query, style: :deepObject, explode: true })
  end
end
swagger_schema() click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 30
def swagger_schema
  fields, found = field_schemas

  obj = {
    type: 'object',
    properties: fields
  }.merge(required_portion)

  [obj, found]
end

Private Instance Methods

extract_value(key, property, input) click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 90
def extract_value(key, property, input)
  if input.key?(key)
    [key, property.value.call(input[key])]
  elsif property.required?
    [key, Report::Value.new(['is required'])]
  end
end
field_schemas() click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 67
def field_schemas
  fields.reduce([{}, {}]) do |(field_schemas, found), (k, v)|
    key_schema, key_found = v.property_schema
    [
      field_schemas.merge(k => key_schema),
      found.merge(key_found)
    ]
  end
end
required_portion() click to toggle source

Either the list of required keys, or something stating “provide at least one key.” This is needed because you can't have an empty list of keys.

# File lib/sober_swag/reporting/input/object.rb, line 80
def required_portion
  required_fields = fields.map { |k, v| k if v.required? }.compact

  if required_fields.empty?
    {}
  else
    { required: required_fields }
  end
end
swagger_parameter_schema() click to toggle source
# File lib/sober_swag/reporting/input/object.rb, line 55
def swagger_parameter_schema
  fields.map do |name, field|
    key_schema, = field.property_schema
    base = {
      name: name,
      schema: key_schema,
      required: field.required?
    }
    field.description ? base.merge(description: field.description) : base
  end
end