module Katarina::TypeGenerator

Public Class Methods

generate(schema) click to toggle source
# File lib/katarina/type_generator.rb, line 6
def generate(schema)
  [
    "type #{schema.name} = ",
    members(schema.types),
    "\n",
  ].join
end

Private Class Methods

indent(level) click to toggle source
# File lib/katarina/type_generator.rb, line 54
def indent(level)
  '  ' * level
end
key(name, level) click to toggle source
# File lib/katarina/type_generator.rb, line 50
def key(name, level)
  "#{indent(level)}#{name}:"
end
member(name, type, level) click to toggle source
# File lib/katarina/type_generator.rb, line 33
def member(name, type, level)
  case type
  when Hash
    "#{key(name, level)} #{members(type, level)}"
  when Array
    "#{member(name, type.first, level)}[]"
  when String
    "#{key(name, level)} #{number?(type) ? 'number' : type}"
  else
    raise "unknown type => #{type.class}: #{type}"
  end
end
members(types, level = 0) click to toggle source
# File lib/katarina/type_generator.rb, line 16
def members(types, level = 0)
  case types
  when Hash
    [
      "{",
      types.map { |name, type| member(name, type, level + 1) },
      "#{indent(level)}}",
    ].join("\n")
  when Array
    "#{members(types.first, level)}[]"
  when String
    number?(types) ? 'number' : types
  else
    raise "unknown type => #{types.class}: #{types}"
  end
end
number?(type) click to toggle source
# File lib/katarina/type_generator.rb, line 46
def number?(type)
  %w[integer float].include?(type)
end