private Optional<ValidationEvent> validateOperation(
            ResourceShape parent,
            ResourceShape child,
            OperationShape operation,
            IdentifierBindingIndex bindingIndex
    ) {
        if (bindingIndex.getOperationBindingType(child, operation) != BindingType.NONE) {
            Set<String> bindings = bindingIndex.getOperationInputBindings(child, operation).keySet();
            Set<String> missing = new LinkedHashSet<>(parent.getIdentifiers().keySet());
            missing.removeAll(bindings);
            if (!missing.isEmpty()) {
                return Optional.of(error(operation,
                        String.format(
                                "This operation is bound to the `%s` resource, which is a child of the `%s` resource, "
                                        + "and it is missing the following resource identifier bindings of `%s`: [%s]",
                                child.getId(),
                                parent.getId(),
                                parent.getId(),
                                ValidationUtils.tickedList(missing))));
            }
        }

        return Optional.empty();
    }
Validates that operations bound to resource shapes have identifier
bindings for all the identifiers of the parent of the binding resource,
that operations bound to a resource with the {@code collection}
trait are bound using a collection binding, and operations bound with
no {@code collection} trait are bound using an instance binding.
smithy-model/src/main/java/software/amazon/smithy/model/validation/validators/ResourceIdentifierBindingValidator.java