# Dry-cli option validation

**URL:** <https://discourse.dry-rb.org/t/dry-cli-option-validation/1034>\
**Category:** Support\
**Created:** [April 7, 2020, 1:35pm UTC](https://discourse.dry-rb.org/t/dry-cli-option-validation/1034 "2020-04-07T13:35:10Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![vpereira](https://avatars.discourse-cdn.com/v4/letter/v/e9c0ed/32.png) [@vpereira](https://discourse.dry-rb.org/u/vpereira)\
**Post date:** [April 7, 2020, 1:35pm UTC](https://discourse.dry-rb.org/t/dry-cli-option-validation/1034/1 "2020-04-07T13:35:10Z")

</div>

Do `dry-cli` support validation on `options` ?

Something like

```auto
option :url, type: :string, format: /^https:\/\/.*/ , ...

```

---

<div class="post-metadata">

**Author:** ![jodosha](https://yyz1.discourse-cdn.com/flex031/user_avatar/discourse.dry-rb.org/jodosha/32/169_2.png) [@jodosha](https://discourse.dry-rb.org/u/jodosha)\
**Post date:** [March 9, 2021, 3:09pm UTC](https://discourse.dry-rb.org/t/dry-cli-option-validation/1034/2 "2021-03-09T15:09:11Z")

</div>

I wouldn’t embed this into `option`, but rather use composition and have a `dry-schema` (or `dry-validation`) contract instead.

```ruby
class MyCommand < Dry::CLI::Command
  def initialize(contract: MyDrySchemaContract)
    @contract = contract
  end

  def call(**input)
    result = @contract.call(input)

    unless result.valid?
      puts validation.errors.to_h # TODO: pretty print error message
      exit(1)
    end

    # do the rest of the job...
  end
end

```
