private List<ValidationEvent> validateService(
            Model model,
            ServiceShape service,
            HttpBindingIndex bindingIndex,
            TopDownIndex topDownIndex
    ) {
        List<ValidationEvent> events = new ArrayList<>();

        for (OperationShape operation : topDownIndex.getContainedOperations(service)) {
            List<HttpBinding> requestBindings = bindingIndex.getRequestBindings(operation, Location.PAYLOAD);
            validateBindings(model, requestBindings).ifPresent(events::add);

            List<HttpBinding> responseBindings = bindingIndex.getResponseBindings(operation, Location.PAYLOAD);
            validateBindings(model, responseBindings).ifPresent(events::add);

            for (ShapeId error : operation.getErrors()) {
                List<HttpBinding> errorBindings = bindingIndex.getResponseBindings(error, Location.PAYLOAD);
                validateBindings(model, errorBindings).ifPresent(events::add);
            }
        }

        return events;
    }
Ensures that the http payload trait is only bound to structures, unions,
documents, blobs, or strings for AWS protocols.
smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/protocols/ProtocolHttpPayloadValidator.java