Reusing schemas
You can easily reuse existing schemas using nested-schema syntax:
AddressSchema = Dry::Schema.Params do
  required(:street).filled(:string)
  required(:city).filled(:string)
  required(:zipcode).filled(:string)
end
UserSchema = Dry::Schema.Params do
  required(:email).filled(:string)
  required(:name).filled(:string)
  required(:address).hash(AddressSchema)
end
UserSchema.(
  email: 'jane@doe',
  name: 'Jane',
  address: { street: nil, city: 'NYC', zipcode: '123' }
).errors.to_h
# {:address=>{:street=>["must be filled"]}}