Module: Parametric::Struct::ClassMethods
- Defined in:
- lib/parametric/struct.rb
Instance Method Summary collapse
-
#after_define_schema(schema) ⇒ Object
this hook is called after schema definition in DSL module.
- #build(attrs) ⇒ Object
- #new!(attrs = {}) ⇒ Object
- #wrap(key, value) ⇒ Object
Instance Method Details
#after_define_schema(schema) ⇒ Object
this hook is called after schema definition in DSL module
58 59 60 61 62 63 64 |
# File 'lib/parametric/struct.rb', line 58 def after_define_schema(schema) schema.fields.keys.each do |key| define_method key do _graph[key] end end end |
#build(attrs) ⇒ Object
66 67 68 69 70 |
# File 'lib/parametric/struct.rb', line 66 def build(attrs) attrs.each_with_object({}) do |(k, v), obj| obj[k] = wrap(k, v) end end |
#new!(attrs = {}) ⇒ Object
51 52 53 54 55 |
# File 'lib/parametric/struct.rb', line 51 def new!(attrs = {}) st = new(attrs) raise InvalidStructError.new(st) unless st.valid? st end |
#wrap(key, value) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/parametric/struct.rb', line 72 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 |