Method: DataModel::Struct.prop
- Defined in:
- lib/data_model/struct.rb
.prop(name, schema, opts = {}) ⇒ void
This method returns an undefined value.
Define a property on the struct.
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/data_model/struct.rb', line 19 def self.prop(name, schema, opts = {}) has_default = opts.key?(:default) default = opts[:default] # ensure values are initialized @types ||= {} @required_types ||= [] # if a prop does not have a default, it is required if !has_default @required_types << name end # store the data model for the prop schema = Array(schema) @types[name] = DataModel.define(schema) # field getter define_method(name) do @values ||= {} types = self.class.types if !types.key?(name) raise "No prop configured for #{name}" end if !@values.key?(name) && has_default return default end return @values[name] end # field setter define_method("#{name}=") do |val| @values ||= {} types = self.class.types if !types.key?(name) raise "No prop configured for #{name}" end model = types.fetch(name) if @coerce val, err = model.coerce(val) else err = model.validate(val) end if @strict && err.any? errors.merge_child(prop, err) raise "Invalid value for #{name}: #{err.to_messages.inspect}" end @values[name] = val end end |