module Paradocs::Struct::ClassMethods

Public Instance Methods

build(attrs) click to toggle source
# File lib/paradocs/struct.rb, line 67
def build(attrs)
  attrs.each_with_object({}) do |(k, v), obj|
    obj[k] = wrap(k, v)
  end
end
new!(attrs = {}, environment = {}) click to toggle source
# File lib/paradocs/struct.rb, line 51
def new!(attrs = {}, environment = {})
  st = new(attrs, environment)
  raise InvalidStructError.new(st) unless st.valid?
  st
end
paradocs_after_define_schema(schema) click to toggle source

this hook is called after schema definition in DSL module

# File lib/paradocs/struct.rb, line 58
def paradocs_after_define_schema(schema)
  schema.fields.keys.each do |key|
    key = schema.fields[key].meta_data[:alias] || key
    define_method key do
      _graph[key]
    end
  end
end
paradocs_build_class_for_child(key, child_schema) click to toggle source
# File lib/paradocs/struct.rb, line 73
def paradocs_build_class_for_child(key, child_schema)
  klass = Class.new do
    include Struct
  end
  klass.schema = child_schema
  klass
end
wrap(key, value) click to toggle source
# File lib/paradocs/struct.rb, line 81
def wrap(key, value)
  field = schema.fields[key]
  return value unless field

  case value
  when Hash
    # find constructor for field
    cons = field.meta_data[:schema]
    if cons.kind_of?(Paradocs::Schema)
      klass = paradocs_build_class_for_child(key, cons)
      klass.paradocs_after_define_schema(cons)
      cons = klass
    end
    cons ? cons.new(value) : value.freeze
  when Array
    value.map{|v| wrap(key, v) }.freeze
  else
    value.freeze
  end
end