Thoughts on dry-validation wrt: composing validations

More updates at this gist

The composable contract returns a result duck type, which is composed of the contract results

The DSL now looks like this:

# expects hash of order data, customer data,
# nested :address, and possibly a nested :delivery_address
class OrderContract < ApplicationContract
  params do
    required(:delivery_required).value(:bool)
    required(:delivery_address_same).value(:bool)
    required(:accept_terms).value(:bool)
  end

  rule(:accept_terms).validate(:acceptance)

  compose do
    contract CustomerContract
    
    path :address do
      contract AddressContract
    end
    
    path :delivery_address do
      contract AddressContract, check: :require_delivery_address?
    end

    register_check :require_delivery_address? do
      values[:delivery_required] && !values[:delivery_address_same]
    end
  end
end