package com.krusoe.openapimerge.validate; import io.swagger.v3.oas.models.Operation; import io.swagger.v3.oas.models.PathItem; import org.openapitools.codegen.validation.GenericValidator; import org.openapitools.codegen.validation.Severity; import org.openapitools.codegen.validation.ValidationResult; import org.openapitools.codegen.validation.ValidationRule; import java.util.HashSet; import java.util.List; import java.util.Set; public class UniqueOperationIdValidator extends GenericValidator { private static Set uniqueOperationIds = new HashSet<>(); public UniqueOperationIdValidator() { super(List.of(ValidationRule.create(Severity.ERROR, "OperationId should be unique across the whole file, all paths and methods", "OperationId is not unique", UniqueOperationIdValidator::testForUniqueness))); } static ValidationRule.Result testForUniqueness(Object item) { if (item instanceof PathItem) { ValidationResult result = new ValidationResult(); for (Operation operation : ((PathItem) item).readOperations()) { if (uniqueOperationIds.contains(operation.getOperationId())) { return new ValidationRule.Fail("Operation is not unique. OperationId: %s Path: %s".formatted(operation.getOperationId(), ((PathItem) item).get$ref())); } else { uniqueOperationIds.add(operation.getOperationId()); } } return new ValidationRule.Pass(); } throw new IllegalArgumentException(); } }