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