private static boolean verifyTagListShape(Model model, Shape tagShape) {
        if (tagShape.isListShape()) {
            ListShape listShape = tagShape.asListShape().get();
            Shape listTargetShape = model.expectShape(listShape.getMember().getTarget());
            if (listTargetShape.isStructureShape()) {
                StructureShape memberStructureShape = listTargetShape.asStructureShape().get();
                // Verify member count is two, and both point to string types.
                if (memberStructureShape.members().size() == 2) {
                    boolean allStrings = true;
                    for (MemberShape member : memberStructureShape.members()) {
                        allStrings &= model.expectShape(member.getTarget()).isStringShape();
                    }
                    return allStrings;
                }
            }
        }
        return false;
    }
Returns true if and only if a provided shape meets criteria that appears to
represent a list or map of tag key value pairs.

@param model Model to retrieve target shapes from when examining
             targets.
@param tagShape shape to examine if it appears to be tags.
@return true if and only if shape meets the criteria for being a TagList
smithy-aws-traits/src/main/java/software/amazon/smithy/aws/traits/tagging/TaggingShapeUtils.java