Module: Parametric::Struct::ClassMethods

Defined in:
lib/parametric/struct.rb

Instance Method Summary collapse

Instance Method Details

#after_define_schema(schema) ⇒ Object

this hook is called after schema definition in DSL module



41
42
43
44
45
46
47
# File 'lib/parametric/struct.rb', line 41

def after_define_schema(schema)
  schema.fields.keys.each do |key|
    define_method key do
      _graph[key]
    end
  end
end

#build(attrs) ⇒ Object



49
50
51
52
53
# File 'lib/parametric/struct.rb', line 49

def build(attrs)
  attrs.each_with_object({}) do |(k, v), obj|
    obj[k] = wrap(k, v)
  end
end

#wrap(key, value) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/parametric/struct.rb', line 55

def wrap(key, value)
  field = schema.fields[key]
  return value unless field

  case value
  when Hash
    # find constructor for field
    cons = field.[:schema]
    if cons.kind_of?(Parametric::Schema)
      klass = Class.new do
        include Struct
      end
      klass.schema = cons
      klass.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