class JsonSchema::Artesano::Hand

Constants

PRIMITIVE_MATERIALS

Attributes

tool[R]

Public Class Methods

new(tool: Tools::Static) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 18
def initialize(tool: Tools::Static)
  self.use_tool(tool)
end

Public Instance Methods

mold(sketch) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 26
def mold(sketch)
  transform( material(sketch) )
end
use_tool(tool) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 22
def use_tool(tool)
  @tool = tool.new
end

Private Instance Methods

material(sketch) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 84
def material(sketch)
  JsonSchema.parse!(sketch).tap { |schema| schema.expand_references! }
end
transform(material) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 32
def transform(material)
  # Enum
  if !material.enum.nil?
    return tool.shape_enum(material)
  end

  case material.type[0]
  when *PRIMITIVE_MATERIALS
    tool.shape_primitive(material)
  when 'object'
    # OneOf
    if material.one_of.any?
      item = tool.select_oneof( material.one_of )
      return tool.shape_object( transform_object(item) )
    end

    # Plain
    tool.shape_object( transform_object(material) )
  when 'array'
    # AnyOf
    if material.any_of.any?
      items = tool.select_anyof( material.any_of )
      items = [items] unless items.is_a?(Array)

      return tool.shape_array( transform_array(items) )
    end

    # AllOf
    if material.all_of.any?
      array = material.all_of
      return tool.shape_array( transform_array(array) )
    end

    tool.shape_array( transform_array(material) )
  else
    # Null
  end
end
transform_array(array) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 79
def transform_array(array)
  items = array.respond_to?(:items) ? [array.items] : array
  items.flatten.map { |item| transform(item) }
end
transform_object(object) click to toggle source
# File lib/json_schema/artesano/hand.rb, line 71
def transform_object(object)
  object.properties.inject(Hash.new) do |result, property|
    result.merge(
      { property[0] => transform( property[1] ) }
    )
  end
end