Compatible with dry-validation 0.7.4
# configure attribute types class MyStruct < DStruct::DStruct attributes strings: [:string], integers: [:int], booleans: [:bool], arrays: [:arr] end # define dry-validation schema - http://dry-rb.org/gems/dry-validation/ MyValidationSchema = Dry::Validation.Schema do key(:string).required(:str?) key(:int).required(:int?) key(:bool).required(:bool?) key(:arr).required(:array?) end # initialize without casting struct = MyStruct.new({string: '123', int: 123, bool: true, arr: [1], date: Date.today}) struct.add_validation_schema MyValidationSchema puts struct.to_h # => {string: '123', int: 123, bool: true, arr: [1], #<Date: 2016年03月22日 ...>} puts struct.valid? # => true puts struct.errors # => {} # initialize with casting struct = MyStruct.new({string: 123, int: '123', bool: 'true', arr: 1, date: '2016-03-22'}) struct.add_validation_schema MyValidationSchema puts struct.to_h # => {string: '123', int: 123, bool: true, arr: [1], #<Date: 2016年03月22日 ...>} puts struct.valid? # => true puts struct.errors # => {} # unknown key struct = MyStruct.new({unknown_key: '123'}) struct.add_validation_schema MyValidationSchema puts struct.valid? # => false puts struct.errors # => {unknown_key: 'unknown key'} # missing keys struct = MyStruct.new({}) struct.add_validation_schema MyValidationSchema puts struct.valid? # => false puts struct.errors # => {:string=>["is missing"], :int=>["is missing"], :bool=>["is missing"], :arr=>["is missing"]} # invalid values struct = MyStruct.new({string: nil, int: nil, bool: nil, arr: nil}) struct.add_validation_schema MyValidationSchema puts struct.valid? # => false puts struct.errors # => {:string=>["must be filled"], :int=>["must be filled"], :bool=>["must be filled"], :arr=>["must be filled"]} # multiple schemas Schema1 = Dry::Validation.Schema{key(:string).required(:str?)} Schema2 = Dry::Validation.Schema{key(:int).required(:int?)} struct = MyStruct.new({string: '123', int: 123}) struct.add_validation_schema Schema1, Schema2 puts struct.valid? # => true
Add this line to your application's Gemfile:
gem 'd_struct'
And then execute:
$ bundle
Or install it yourself as:
$ gem install d_struct
Bug reports and pull requests are welcome on GitHub at https://github.com/damir/d_struct.
The gem is available as open source under the terms of the MIT License.