class SchemaSerializer::Schema

Attributes

items[R]
key[R]
nullable[R]
properties[R]
required[R]
type[R]

Public Class Methods

new(key, hash = {}) click to toggle source
# File lib/schema_serializer/schema.rb, line 5
def initialize(key, hash = {})
  @key      = key
  @type     = hash["type"]
  @nullable = !hash["nullable"].nil?

  case type
  when "array"
    @items = self.class.new(@key, hash.fetch("items"))
  when "object", nil
    @required = hash["required"] || []
    @properties = hash.fetch("properties").each_with_object({}) { |(column, property), obj|
      obj[column] = self.class.new(column, property)
    }
  end
end

Public Instance Methods

serialize(object) click to toggle source
# File lib/schema_serializer/schema.rb, line 21
def serialize(object)
  if object.nil?
    return nil if nullable
    raise NullValue, "#{key} is not allowed to be null" if SchemaSerializer.config.raise_on_null
  end

  case type
  when "integer"
    object.to_i
  when "number"
    object.to_f
  when "string"
    object.to_s
  when "boolean"
    !!object
  when "array"
    serialize_array(object)
  else
    serialize_object(object)
  end
end

Private Instance Methods

get_value(object, column) click to toggle source
# File lib/schema_serializer/schema.rb, line 58
def get_value(object, column)
  return object[column] || object[column.to_sym] if object.is_a?(Hash)

  value = object.public_send(column)
  return value if !object.respond_to?(:defined_enums) || !object.defined_enums.has_key?(column)

  object.defined_enums[column][value]
end
serialize_array(object) click to toggle source
# File lib/schema_serializer/schema.rb, line 45
def serialize_array(object)
  object.map { |item| items.serialize(item) }
end
serialize_object(object) click to toggle source
# File lib/schema_serializer/schema.rb, line 49
def serialize_object(object)
  not_enough_columns = required - properties.keys
  raise RequiredNotDefined, not_enough_columns.join(", ") unless not_enough_columns.empty?

  properties.each_with_object({}) { |(column, schema), obj|
    obj[column] = schema.serialize(get_value(object, column))
  }
end