# How can I report a failure in a dry-types constructor?

**URL:** <https://discourse.dry-rb.org/t/how-can-i-report-a-failure-in-a-dry-types-constructor/862>\
**Category:** dry-types\
**Created:** [July 29, 2019, 4:17pm UTC](https://discourse.dry-rb.org/t/how-can-i-report-a-failure-in-a-dry-types-constructor/862 "2019-07-29T16:17:52Z")\
**Posts on this page:** 1\
**Showing post:** 4

<div class="post-metadata">

**Author:** ![solnic](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.dry-rb.org/solnic/32/779_2.png) [@solnic](https://discourse.dry-rb.org/u/solnic)\
**Post date:** [July 30, 2019, 8:54pm UTC](https://discourse.dry-rb.org/t/how-can-i-report-a-failure-in-a-dry-types-constructor/862/4 "2019-07-30T20:54:57Z")

</div>

You could do this:

```ruby
# frozen_string_literal: true

require 'dry/validation'
require 'date'

module Types
  include Dry::Types()

  MyDate = Types::Date.constructor do |value|
    ::Date.today + 1 if value.eql?('1 day')
  end
end

class MyContract < Dry::Validation::Contract
  params do
    required(:duration).filter(:string, :filled?).value(Types::MyDate)
  end
end

contract = MyContract.new

puts contract.(duration: nil).inspect
#<Dry::Validation::Result{:duration=>nil} errors={:duration=>["must be a string"]}>

puts contract.(duration: "").inspect
#<Dry::Validation::Result{:duration=>""} errors={:duration=>["must be filled"]}>

puts contract.(duration: "foo bar").inspect
#<Dry::Validation::Result{:duration=>nil} errors={:duration=>["must be a date"]}>

puts contract.(duration: "1 day").inspect
#<Dry::Validation::Result{:duration=>#<Date: 2019-07-31 ((2458696j,0s,0n),+0s,2299161j)>} errors={}>

```

You can read more about filter rules [here](https://dry-rb.org/gems/dry-schema/advanced/filtering/).

---

_[View the full topic](https://discourse.dry-rb.org/t/how-can-i-report-a-failure-in-a-dry-types-constructor/862)._
